[Linux] 파일 내용 확인 실습

mommers·2026년 1월 30일

Linux

목록 보기
7/59
post-thumbnail

파일 내용 확인 1. cat, tac, nl

  • 학습: 짧은 파일 출력. 파일 합치기.
  • 실습:
    • cat > file.txt로 키보드 입력 내용을 파일로 저장.
pi@pi-222:~/project/0130 $ cat > file.txt
file check
EOF
^C
pi@pi-222:~/project/0130 $ ls
file.txt
pi@pi-222:~/project/0130 $ nano file.txt

  • cat file1 file2 > file3 리다이렉션으로 파일 병합.
pi@pi-222:~/project/0130 $ nano file1.txt
pi@pi-222:~/project/0130 $ nano file2.txt
pi@pi-222:~/project/0130 $ cat file1 file2 > file3
cat: file1: No such file or directory
cat: file2: No such file or directory
pi@pi-222:~/project/0130 $ ls
file1.txt  file2.txt  file3  file.txt
pi@pi-222:~/project/0130 $ cat file1.txt file2.txt > file3.txt
pi@pi-222:~/project/0130 $ ls
file1.txt  file2.txt  file3  file3.txt  file.txt
pi@pi-222:~/project/0130 $ nano file3.txt

  • nl 명령어로 소스 코드 파일에 줄 번호 붙여서 출력해보기.
pi@pi-222:~/project/0130 $ nl file1.txt file2.txt > file4.txt
pi@pi-222:~/project/0130 $ ls
file1.txt  file2.txt  file3  file3.txt  file4.txt  file.txt
pi@pi-222:~/project/0130 $ nano file4.txt

  • tac으로 로그 파일 역순(최신 내용부터) 출력해보기.
pi@pi-222:~/project/0130 $ tac file3.txt
file2.txt
file1.txt

파일 내용 확인 2. head, tail, less

1.syslog 생성하기


Ubuntu 24.04 (그리고 최신 라즈베리파이 OS)부터는 /var/log/syslog 파일을 만드는 rsyslog 패키지가 기본 설치되지 않습니다.

대신 systemd-journald 가 로그를 관리하며, 텍스트 파일이 아닌 바이너리(DB) 형태로 저장합니다.

방법 1. 요즘 방식 (추천: journalctl 사용)

파일을 열지 않고 전용 명령어로 확인합니다. 기능은 똑같습니다.

  • 실시간 로그 확인 (tail -f 대체):Bash
    journalctl -f
  • 전체 로그 보기 (cat 대체):Bash
    journalctl
  • 부팅 후 로그만 보기:Bash
    journalctl -b

방법 2. 옛날 방식 (syslog 파일 부활시키기)

/var/log/syslog 패키지를 설치하면 바로 생성됩니다.

  1. 설치:Bash

    sudo apt update
    sudo apt install -y rsyslog
  2. 확인:
    설치 직후부터 /var/log/syslog 파일이 생성되고 로그가 쌓이기 시작합니다.

결론: 그냥 journalctl -f 명령어를 쓰는 습관을 들이는 것이 좋습니다. (더 보기 편함)


2. syslog 이벤트 발생하기


실습을 위해 터미널을 2개 띄우고 진행하세요.

1단계: 감시하기 (터미널 1)

먼저 로그가 들어오는지 실시간으로 지켜봅니다.

Bash

journalctl -f

(커서가 깜빡거리며 대기 상태가 됩니다.)

2단계: 로그 발생시키기 (터미널 2)

방법 1. 텍스트 보내기 (logger) - 가장 추천

터미널 2에서 아래 명령어를 치면, 터미널 1에 즉시 뜹니다.

Bash

logger "안녕하세요, 로그 테스트 중입니다."

  • 결과: Jan 29 21:00:00 ubuntu user: 안녕하세요, 로그 테스트 중입니다.

방법 2. 에러처럼 꾸며서 보내기

빨간색이나 강조된 로그를 보고 싶다면 -p (priority) 옵션을 씁니다.

Bash

logger -p user.err "심각한 에러 발생! (테스트임)"

방법 3. 시스템 행동 유발하기 (sudo)

sudo 명령어를 쓸 때마다 보안 로그가 남습니다.

Bash

sudo ls

  • 결과: sudo: ubuntu : TTY=pts/1 ; PWD=... ; USER=root ; COMMAND=/usr/bin/ls

방법 4. 하드웨어 이벤트 (USB)

라즈베리파이 USB 포트에 마우스나 키보드, USB 메모리를 꽂았다 빼보세요.
커널(kernel)이 하드웨어를 인식하는 과정이 주루룩 올라옵니다.

⇒ 라즈베리파이에 USB-TTL을 꼽습니다.


3. syslog 레벨


Syslog도 커널(printk)과 동일한 표준 8단계 레벨(0~7)을 사용합니다.

사실 printk의 레벨 시스템 자체가 Syslog 표준을 따온 것입니다.

1. Syslog 8단계 레벨표 (Severity)

숫자가 낮을수록 심각하고, 높을수록 단순 정보입니다.

번호이름 (Keyword)설명비고
0emergEmergency시스템이 완전히 멈춤 (사용 불가)
1alertAlert즉시 조치 필요 (DB 손상 등)
2critCritical치명적 오류 (하드웨어 에러)
3errError일반적 기능 오류 (가장 흔함)
4warningWarning경고 (문제 될 소지 있음)
5noticeNotice정상이지만 중요한 알림
6infoInfo일반적인 정보 (로그인, 시작 등)
7debugDebug개발용 디버깅 정보
sudo systemd-analyze set-log-level debug

# 원상복구: 
sudo systemd-analyze set-log-level info

# 확인
systemctl show -p LogLevel
  • LogLevel 확인 가능!
pi@pi-222:~ $ sudo systemd-analyze set-log-level debug
pi@pi-222:~ $ systemctl show -p LogLevel
LogLevel=debug
pi@pi-222:~ $ sudo systemd-analyze set-log-level info
pi@pi-222:~ $ systemctl show -p LogLevel
LogLevel=info

2. Syslog만의 특징: "카테고리"가 있다

Syslog는 레벨(Severity) 외에 "누가 보냈냐(Facility)"라는 꼬리표가 하나 더 붙습니다.

이 둘을 합쳐서 카테고리.레벨 형식으로 사용합니다.

  • 형식: facility.level
  • 예시:
    • kern.err: 커널에서 발생한 에러
    • auth.notice: 보안/인증 관련 알림
    • cron.info: 예약 작업 관련 정보
    • user.debug: 일반 사용자 프로그램의 디버그

3. 실습: 레벨 지정해서 로그 보내보기

logger 명령어에 -p (priority) 옵션을 쓰면 레벨을 골라서 보낼 수 있습니다.

터미널 1 (감시):

Bash

journalctl -f

터미널 2 (발송):

Bash

# 1. 에러 레벨로 보내기 (빨간색으로 표시될 수 있음)
logger -p user.err "이것은 에러입니다!"

# 2. 경고 레벨로 보내기
logger -p user.warning "이것은 경고입니다."

# 3. 디버그 레벨로 보내기 (설정에 따라 안 보일 수 있음)
logger -p user.debug "이것은 개발용 잡담입니다."

4. 설정 파일에서의 활용 (/etc/rsyslog.conf)

리눅스 내부 설정 파일에서는 이 레벨을 이용해 "어떤 로그를 저장할지" 결정합니다.

Plaintext

# 예시: /etc/rsyslog.conf 내용 중

# 1. 모든 카테고리의 info 레벨 이상(*)만 저장해라 (debug는 버림)
*.info;mail.none;authpriv.none      /var/log/syslog

# 2. 에러(err) 레벨 이상인 것만 따로 모아라
*.err                               /var/log/error.log

핵심: 여기서도 *.info라고 쓰면, Info(6)보다 숫자가 낮은(0~5, 더 중요한) 로그들은 자동으로 다 포함됩니다. (부등호 법칙 적용)


커널 로그 (드라이버 개발 시 printk)

드라이버 개발 중 사용하는 printk 메시지는 이미 시리얼로 나가고 있을 것입니다.
만약 안 나온다면, 로그 레벨이 너무 높게 잡혀 있어서 중요한 것만 나오는 상태입니다.

해결책 (모든 잡다한 커널 로그 다 뱉어내게 하기):
터미널에서 아래 명령어를 입력하세요.

Bash

# 콘솔 로그 레벨을 최고(8)로 높임
sudo sh -c "echo 8 > /proc/sys/kernel/printk"

이제 printk로 찍는 모든 내용이 시리얼 모니터에 실시간으로 뜹니다.

usb메모리등을 라즈베리파이의 usb에 꼽았다 빼면 커널로그가 보이기 시작함.


사용자 로그 (syslog, logger, 일반 앱)

아까 logger "hello"로 보낸 메시지나, 파이썬/C++ 앱에서 printf로 찍은 것은 시리얼 콘솔로 자동으로 가지 않습니다. (이건 저널에만 기록됩니다.)


평상시(기본값)는 4 로 설정하는 것이 표준입니다.

리눅스 커널의 로그 레벨은 숫자가 낮을수록 심각한 문제이고, 높을수록 사소한 정보입니다.

보통 "경고(Warning, 4)" 단계까지만 화면에 보여주고, 잡다한 정보는 숨기는 것이 기본 설정입니다.

1. 원래대로 되돌리는 명령어 (복구)

Bash

sudo sh -c "echo 4 > /proc/sys/kernel/printk"

cat /proc/sys/kernel/printk

2. 왜 '4' 인가요? (레벨 가이드)

커널 로그 레벨은 총 8단계(0~7)가 있습니다. 설정한 숫자보다 작은(더 심각한) 레벨만 화면에 출력됩니다.

레벨이름설명출력 여부 (설정값 4일 때)
0Emergency시스템 멈춤 (최악)✅ 출력됨
1Alert즉각 조치 필요✅ 출력됨
2Critical치명적 에러✅ 출력됨
3Error일반 에러✅ 출력됨
4Warning경고 (주의 요망)여기서부터 차단 (화면엔 안 나옴)
5Notice알림 (정상이지만 중요함)❌ 차단
6Info일반 정보 (드라이버 로딩 등)❌ 차단
7Debug디버깅용 잡다한 정보❌ 차단
  • 설정 8 (Debug 모드): 모든 잡담(pr_info, pr_debug)까지 다 보여줌. 드라이버 개발할 때만 사용.
  • 설정 4 (Quiet 모드): 에러나 경고가 떴을 때만 알려줌. 평상시 사용.

3. 계속 8로 두면 안 되나요?

두 가지 문제가 생깁니다.

  1. 성능 저하: 시리얼 포트(UART)는 속도가 느립니다. 커널이 모든 동작마다 로그를 뱉어내면, CPU가 로그 출력하느라 실제 작업을 못해서 시스템이 버벅거립니다.
  2. 중요한 정보 놓침: 쓸데없는 정보(Info)가 너무 빨리 스크롤 되어 지나가버려서, 진짜 중요한 에러(Error)를 못 보고 지나칠 수 있습니다.

결론: 개발 끝나면 꼭 4로 돌려놓으세요!

  • /var/log/syslog 파일을 less로 열고 검색(/), 이동(G, g) 연습.
  • head -n 20 vs tail -n 20 비교.
  • 핵심: tail -f 옵션 켜두고, 다른 터미널에서 시스템 변화(USB 꽂기 등) 실시간 모니터링.
  • 다른 쉘에서 로그인 정보를 실시간으로 확인하기
profile
임베디드 개발자가 되기 위해 공부중입니다!

0개의 댓글