둜그 관리

둜그 관리

ν•™μŠ΅ λͺ©ν‘œ

이 λ¬Έμ„œλ₯Ό 톡해 λ‹€μŒμ„ ν•™μŠ΅ν•©λ‹ˆλ‹€:

  • systemd-journald의 μ„€μ •κ³Ό ν™œμš©
  • rsyslog μ„€μ • 및 필터링
  • logrotateλ₯Ό ν†΅ν•œ 둜그 μˆœν™˜
  • 원격 둜그 μˆ˜μ§‘ ꡬ성

λ‚œμ΄λ„: ⭐⭐⭐ (쀑급-κ³ κΈ‰)


λͺ©μ°¨

  1. Linux 둜그 μ‹œμŠ€ν…œ κ°œμš”
  2. systemd-journald
  3. journalctl κ³ κΈ‰ μ‚¬μš©λ²•
  4. rsyslog μ„€μ •
  5. logrotate
  6. 원격 둜그 μˆ˜μ§‘
  7. 둜그 뢄석 도ꡬ

1. Linux 둜그 μ‹œμŠ€ν…œ κ°œμš”

둜그 μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    μ• ν”Œλ¦¬μΌ€μ΄μ…˜ / μ„œλΉ„μŠ€                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                β”‚                         β”‚
                β–Ό                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    systemd-journald       β”‚   β”‚    rsyslog / syslog-ng      β”‚
β”‚    (λ°”μ΄λ„ˆλ¦¬ 저널)         │──▢│    (ν…μŠ€νŠΈ 둜그 파일)        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                β”‚                         β”‚
                β–Ό                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  /run/log/journal/        β”‚   β”‚  /var/log/*.log             β”‚
β”‚  /var/log/journal/        β”‚   β”‚  원격 μ„œλ²„                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

μ£Όμš” 둜그 파일

파일 λ‚΄μš©
/var/log/messages 일반 μ‹œμŠ€ν…œ λ©”μ‹œμ§€ (RHEL/CentOS)
/var/log/syslog 일반 μ‹œμŠ€ν…œ λ©”μ‹œμ§€ (Ubuntu/Debian)
/var/log/auth.log 인증 κ΄€λ ¨ 둜그 (Ubuntu)
/var/log/secure 인증 κ΄€λ ¨ 둜그 (RHEL)
/var/log/kern.log 컀널 λ©”μ‹œμ§€
/var/log/dmesg λΆ€νŒ… μ‹œ 컀널 λ©”μ‹œμ§€
/var/log/cron 크둠 μž‘μ—… 둜그
/var/log/maillog 메일 μ„œλ²„ 둜그

둜그 μš°μ„ μˆœμœ„ (Severity)

레벨 이름 μ„€λͺ…
0 emerg μ‹œμŠ€ν…œ μ‚¬μš© λΆˆκ°€
1 alert μ¦‰μ‹œ 쑰치 ν•„μš”
2 crit μ‹¬κ°ν•œ 였λ₯˜
3 err μ—λŸ¬
4 warning κ²½κ³ 
5 notice μ •μƒμ΄μ§€λ§Œ μ£Όλͺ©ν•  λ§Œν•œ 상황
6 info 정보성 λ©”μ‹œμ§€
7 debug 디버그 λ©”μ‹œμ§€

2. systemd-journald

journald μ„€μ •

# μ„€μ • 파일
sudo vi /etc/systemd/journald.conf
# /etc/systemd/journald.conf
[Journal]
# μ €μž₯ 방식: volatile(λ©”λͺ¨λ¦¬), persistent(λ””μŠ€ν¬), auto, none
Storage=persistent

# μ΅œλŒ€ 크기 (λ””μŠ€ν¬ μ €μž₯ μ‹œ)
SystemMaxUse=500M
SystemKeepFree=1G
SystemMaxFileSize=50M
SystemMaxFiles=100

# λŸ°νƒ€μž„ μ €μž₯μ†Œ (λ©”λͺ¨λ¦¬)
RuntimeMaxUse=50M

# 둜그 μ••μΆ•
Compress=yes

# 봉인 (tamper-evident)
Seal=yes

# rsyslog둜 전달
ForwardToSyslog=yes

# μ½˜μ†” 좜λ ₯
ForwardToConsole=no

# μ΅œλŒ€ 보쑴 κΈ°κ°„
MaxRetentionSec=1month

# 속도 μ œν•œ
RateLimitIntervalSec=30s
RateLimitBurst=10000
# μ„€μ • 적용
sudo systemctl restart systemd-journald

영ꡬ μ €μž₯ ν™œμ„±ν™”

# 저널 디렉토리 생성 (persistent storage)
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal

# κΆŒν•œ μ„€μ •
sudo chown root:systemd-journal /var/log/journal
sudo chmod 2755 /var/log/journal

# journald μž¬μ‹œμž‘
sudo systemctl restart systemd-journald

저널 μƒνƒœ 확인

# λ””μŠ€ν¬ μ‚¬μš©λŸ‰
journalctl --disk-usage

# 저널 파일 확인
journalctl --header

# 저널 무결성 검증
journalctl --verify

3. journalctl κ³ κΈ‰ μ‚¬μš©λ²•

기본 쑰회

# λͺ¨λ“  둜그
journalctl

# μ—­μˆœ (μ΅œμ‹  λ¨Όμ €)
journalctl -r

# μ‹€μ‹œκ°„ νŒ”λ‘œμš°
journalctl -f

# λ§ˆμ§€λ§‰ N쀄
journalctl -n 50

# νŽ˜μ΄μ € 없이 좜λ ₯
journalctl --no-pager

μ‹œκ°„ 기반 필터링

# 였늘 둜그
journalctl --since today

# μ–΄μ œ 둜그
journalctl --since yesterday --until today

# νŠΉμ • μ‹œκ°„ λ²”μœ„
journalctl --since "2024-01-15 10:00:00" --until "2024-01-15 12:00:00"

# μƒλŒ€μ  μ‹œκ°„
journalctl --since "1 hour ago"
journalctl --since "30 minutes ago"

# λΆ€νŒ… κ΄€λ ¨
journalctl -b          # ν˜„μž¬ λΆ€νŒ…
journalctl -b -1       # 이전 λΆ€νŒ…
journalctl --list-boots # λΆ€νŒ… λͺ©λ‘

μ„œλΉ„μŠ€/μœ λ‹› 필터링

# νŠΉμ • μ„œλΉ„μŠ€
journalctl -u nginx.service
journalctl -u nginx -u php-fpm

# 컀널 λ©”μ‹œμ§€
journalctl -k

# νŠΉμ • PID
journalctl _PID=1234

# νŠΉμ • μ‹€ν–‰ 파일
journalctl /usr/bin/bash

# νŠΉμ • μ‚¬μš©μž
journalctl _UID=1000

μš°μ„ μˆœμœ„ 필터링

# μ—λŸ¬ 이상
journalctl -p err

# κ²½κ³  이상
journalctl -p warning

# λ²”μœ„ μ§€μ •
journalctl -p err..crit

# 숫자둜 μ§€μ •
journalctl -p 3

좜λ ₯ ν˜•μ‹

# JSON ν˜•μ‹
journalctl -o json
journalctl -o json-pretty

# 상세 좜λ ₯
journalctl -o verbose

# κ°„λ‹¨ν•œ 좜λ ₯
journalctl -o short
journalctl -o short-precise  # 마이크둜초 포함

# cat μŠ€νƒ€μΌ (λ©”μ‹œμ§€λ§Œ)
journalctl -o cat

# 내보내기 ν˜•μ‹
journalctl -o export

볡합 쿼리

# μ‘°ν•© (AND)
journalctl -u nginx -p err --since today

# μ»€μŠ€ν…€ ν•„λ“œ
journalctl _SYSTEMD_UNIT=sshd.service _PID=1234

# λ©”μ‹œμ§€ 검색
journalctl -g "error|fail|critical"

# ν•„λ“œ λͺ©λ‘ 보기
journalctl -F _SYSTEMD_UNIT
journalctl -F PRIORITY

저널 μœ μ§€λ³΄μˆ˜

# 였래된 둜그 μ‚­μ œ (μ‹œκ°„ κΈ°μ€€)
sudo journalctl --vacuum-time=30d

# 였래된 둜그 μ‚­μ œ (크기 κΈ°μ€€)
sudo journalctl --vacuum-size=500M

# 파일 수 κΈ°μ€€ μ‚­μ œ
sudo journalctl --vacuum-files=10

# λͺ¨λ“  저널 μ‚­μ œ
sudo journalctl --rotate
sudo journalctl --vacuum-time=1s

4. rsyslog μ„€μ •

rsyslog κΈ°λ³Έ μ„€μ •

# 메인 μ„€μ • 파일
sudo vi /etc/rsyslog.conf
# /etc/rsyslog.conf (μ£Όμš” μ„Ήμ…˜)

# λͺ¨λ“ˆ λ‘œλ“œ
module(load="imuxsock")    # 둜컬 μ‹œμŠ€ν…œ 둜그
module(load="imjournal")   # journald 톡합
module(load="imklog")      # 컀널 둜그

# μ „μ—­ μ„€μ •
global(
    workDirectory="/var/lib/rsyslog"
    maxMessageSize="64k"
)

# κΈ°λ³Έ κ·œμΉ™
*.info;mail.none;authpriv.none;cron.none    /var/log/messages
authpriv.*                                   /var/log/secure
mail.*                                       -/var/log/maillog
cron.*                                       /var/log/cron
*.emerg                                      :omusrmsg:*

ν•„ν„° 문법

# κΈ°λ³Έ 문법: facility.priority  action

# facility: auth, authpriv, cron, daemon, kern, mail, user, local0-7, *
# priority: emerg, alert, crit, err, warning, notice, info, debug, none, *

# μ˜ˆμ‹œ
kern.*                      /var/log/kern.log        # λͺ¨λ“  컀널 λ©”μ‹œμ§€
*.crit                      /var/log/critical.log    # λͺ¨λ“  μ‹¬κ°ν•œ μ—λŸ¬
mail.err                    /var/log/mail-err.log    # 메일 μ—λŸ¬
*.info;mail.none            /var/log/messages        # info 이상, 메일 μ œμ™Έ

κ³ κΈ‰ 필터링

# /etc/rsyslog.d/custom.conf

# 속성 기반 ν•„ν„°
:programname, isequal, "nginx" /var/log/nginx/access.log
:programname, startswith, "postfix" /var/log/mail/postfix.log

# λ©”μ‹œμ§€ λ‚΄μš© 기반
:msg, contains, "error" /var/log/errors.log
:msg, regex, "failed.*authentication" /var/log/auth-failures.log

# 볡합 쑰건
if $programname == 'sshd' and $msg contains 'Failed' then {
    action(type="omfile" file="/var/log/ssh-failures.log")
    stop
}

ν…œν”Œλ¦Ώ μ‚¬μš©

# μ»€μŠ€ν…€ 둜그 ν˜•μ‹
template(name="CustomFormat" type="string"
    string="%timegenerated% %HOSTNAME% %syslogtag%%msg%\n")

# JSON ν˜•μ‹
template(name="JsonFormat" type="list") {
    constant(value="{")
    constant(value="\"timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
    constant(value="\",\"host\":\"")       property(name="hostname")
    constant(value="\",\"program\":\"")    property(name="programname")
    constant(value="\",\"severity\":\"")   property(name="syslogseverity-text")
    constant(value="\",\"message\":\"")    property(name="msg" format="json")
    constant(value="\"}\n")
}

# ν…œν”Œλ¦Ώ 적용
*.* action(type="omfile" file="/var/log/json.log" template="JsonFormat")

쑰건뢀 처리

# RainerScript 문법
if $programname == 'nginx' then {
    if $syslogseverity <= 3 then {
        # μ—λŸ¬ 이상은 별도 파일
        action(type="omfile" file="/var/log/nginx/error.log")
    } else {
        # λ‚˜λ¨Έμ§€λŠ” 일반 둜그
        action(type="omfile" file="/var/log/nginx/access.log")
    }
    stop
}

5. logrotate

κΈ°λ³Έ μ„€μ •

# μ „μ—­ μ„€μ •
sudo vi /etc/logrotate.conf
# /etc/logrotate.conf

# μˆœν™˜ μ£ΌκΈ°: daily, weekly, monthly
weekly

# 보관할 둜그 수
rotate 4

# μƒˆ 둜그 파일 생성
create

# λ‚ μ§œ ν™•μž₯자 μ‚¬μš©
dateext

# μ••μΆ•
compress
delaycompress

# 빈 둜그 파일 λ¬΄μ‹œ
notifempty

# κ°œλ³„ μ„€μ • 포함
include /etc/logrotate.d

μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ³„ μ„€μ •

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}
# /etc/logrotate.d/mysql
/var/log/mysql/*.log {
    daily
    rotate 7
    missingok
    create 640 mysql adm
    compress
    sharedscripts
    postrotate
        test -x /usr/bin/mysqladmin || exit 0
        if [ -f /root/.my.cnf ]; then
            /usr/bin/mysqladmin flush-logs
        fi
    endscript
}

κ³ κΈ‰ μ˜΅μ…˜

# /etc/logrotate.d/custom-app
/var/log/myapp/*.log {
    # μˆœν™˜ μ£ΌκΈ°
    daily

    # 보관 개수
    rotate 30

    # 크기 기반 μˆœν™˜
    size 100M

    # μ΅œμ†Œ 크기 (이보닀 μž‘μœΌλ©΄ μˆœν™˜ μ•ˆ 함)
    minsize 10M

    # μ΅œλŒ€ 보관 κΈ°κ°„
    maxage 365

    # μ••μΆ• μ„€μ •
    compress
    compresscmd /usr/bin/xz
    compressoptions -9
    compressext .xz
    delaycompress

    # 파일 없어도 μ—λŸ¬ μ•„λ‹˜
    missingok

    # 빈 파일 μˆœν™˜ μ•ˆ 함
    notifempty

    # μƒˆ 파일 생성
    create 0644 root root

    # λ˜λŠ” κΈ°μ‘΄ 파일 μœ μ§€
    # copytruncate

    # 슀크립트
    prerotate
        echo "About to rotate logs"
    endscript

    postrotate
        systemctl reload myapp
    endscript

    firstaction
        echo "Starting log rotation batch"
    endscript

    lastaction
        echo "Finished log rotation batch"
    endscript
}

logrotate ν…ŒμŠ€νŠΈ

# λ“œλΌμ΄λŸ° (μ‹€μ œ μ‹€ν–‰ μ•ˆ 함)
sudo logrotate -d /etc/logrotate.d/nginx

# κ°•μ œ μ‹€ν–‰
sudo logrotate -f /etc/logrotate.d/nginx

# 상세 좜λ ₯
sudo logrotate -v /etc/logrotate.conf

# μƒνƒœ 파일 확인
cat /var/lib/logrotate/status

6. 원격 둜그 μˆ˜μ§‘

rsyslog μ„œλ²„ μ„€μ •

# /etc/rsyslog.conf (μ„œλ²„)

# UDP μˆ˜μ‹  ν™œμ„±ν™”
module(load="imudp")
input(type="imudp" port="514")

# TCP μˆ˜μ‹  ν™œμ„±ν™”
module(load="imtcp")
input(type="imtcp" port="514")

# ν˜ΈμŠ€νŠΈλ³„ 둜그 뢄리
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs

# λ˜λŠ” RainerScript μ‚¬μš©
template(name="RemoteLogsByHost" type="string"
    string="/var/log/remote/%HOSTNAME%/%$YEAR%-%$MONTH%-%$DAY%.log")

if $fromhost-ip != '127.0.0.1' then {
    action(type="omfile" dynaFile="RemoteLogsByHost")
    stop
}

rsyslog ν΄λΌμ΄μ–ΈνŠΈ μ„€μ •

# /etc/rsyslog.d/remote.conf (ν΄λΌμ΄μ–ΈνŠΈ)

# UDP둜 전솑 (@)
*.* @logserver.example.com:514

# TCP둜 전솑 (@@)
*.* @@logserver.example.com:514

# νŠΉμ • 둜그만 전솑
auth.* @@logserver.example.com:514
*.err @@logserver.example.com:514

# 큐 μ„€μ • (μ•ˆμ •μ  전솑)
action(
    type="omfwd"
    target="logserver.example.com"
    port="514"
    protocol="tcp"
    queue.type="LinkedList"
    queue.filename="remote_queue"
    queue.saveOnShutdown="on"
    queue.maxDiskSpace="1g"
    action.resumeRetryCount="-1"
)

TLS μ•”ν˜Έν™” μ„€μ •

# μ„œλ²„ μ„€μ •
module(load="imtcp"
    StreamDriver.Name="gtls"
    StreamDriver.Mode="1"
    StreamDriver.AuthMode="x509/name"
)

global(
    DefaultNetstreamDriver="gtls"
    DefaultNetstreamDriverCAFile="/etc/rsyslog.d/ca.pem"
    DefaultNetstreamDriverCertFile="/etc/rsyslog.d/server-cert.pem"
    DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/server-key.pem"
)

input(type="imtcp" port="6514")
# ν΄λΌμ΄μ–ΈνŠΈ μ„€μ •
global(
    DefaultNetstreamDriver="gtls"
    DefaultNetstreamDriverCAFile="/etc/rsyslog.d/ca.pem"
    DefaultNetstreamDriverCertFile="/etc/rsyslog.d/client-cert.pem"
    DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/client-key.pem"
)

action(
    type="omfwd"
    target="logserver.example.com"
    port="6514"
    protocol="tcp"
    StreamDriver="gtls"
    StreamDriverMode="1"
    StreamDriverAuthMode="x509/name"
)

λ°©ν™”λ²½ μ„€μ •

# RHEL/CentOS (firewalld)
sudo firewall-cmd --permanent --add-port=514/tcp
sudo firewall-cmd --permanent --add-port=514/udp
sudo firewall-cmd --reload

# Ubuntu (ufw)
sudo ufw allow 514/tcp
sudo ufw allow 514/udp

7. 둜그 뢄석 도ꡬ

# μ„€μΉ˜
# Ubuntu/Debian
sudo apt install lnav

# RHEL/CentOS
sudo yum install epel-release
sudo yum install lnav

# μ‚¬μš©
lnav /var/log/syslog
lnav /var/log/nginx/*.log

# 원격 둜그 (SSH)
lnav ssh://user@server/var/log/syslog

# 필터링 (λ‚΄λΆ€ λͺ…λ Ή)
:filter-in error
:filter-out debug

multitail

# μ„€μΉ˜
sudo apt install multitail  # Ubuntu
sudo yum install multitail  # RHEL

# μ—¬λŸ¬ 파일 λ™μ‹œ λͺ¨λ‹ˆν„°λ§
multitail /var/log/syslog /var/log/auth.log

# 색상 ꡬ뢄
multitail -ci green /var/log/access.log -ci red /var/log/error.log

GoAccess (μ›Ή 둜그 뢄석)

# μ„€μΉ˜
sudo apt install goaccess  # Ubuntu
sudo yum install goaccess  # RHEL

# ν„°λ―Έλ„μ—μ„œ μ‹€μ‹œκ°„ 뢄석
goaccess /var/log/nginx/access.log -c

# HTML λ³΄κ³ μ„œ 생성
goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED

# μ‹€μ‹œκ°„ HTML λŒ€μ‹œλ³΄λ“œ
goaccess /var/log/nginx/access.log -o /var/www/html/report.html \
    --log-format=COMBINED --real-time-html

κ°„λ‹¨ν•œ 뢄석 λͺ…λ Ήμ–΄

# κ°€μž₯ λ§Žμ€ μš”μ²­ IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head

# HTTP μƒνƒœ μ½”λ“œ 뢄포
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# μ‹œκ°„λŒ€λ³„ μš”μ²­ 수
awk '{print $4}' /var/log/nginx/access.log | cut -d: -f2 | sort | uniq -c

# μ—λŸ¬ λ©”μ‹œμ§€ λΉˆλ„
grep -i error /var/log/syslog | awk '{print $5}' | sort | uniq -c | sort -rn | head

# μ‹€νŒ¨ν•œ SSH 둜그인
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn

μ—°μŠ΅ 문제

문제 1: journalctl 쿼리

λ‹€μŒ 쑰건의 둜그λ₯Ό μ‘°νšŒν•˜λŠ” λͺ…령을 μž‘μ„±ν•˜μ„Έμš”: 1. nginx μ„œλΉ„μŠ€μ˜ μ—λŸ¬ 둜그만 (였늘) 2. νŠΉμ • PID(1234)의 둜그λ₯Ό JSON으둜 좜λ ₯ 3. μ§€λ‚œ 1μ‹œκ°„ λ™μ•ˆμ˜ 컀널 κ²½κ³  이상 λ©”μ‹œμ§€

문제 2: rsyslog ν•„ν„°

λ‹€μŒ μš”κ΅¬μ‚¬ν•­μ„ λ§Œμ‘±ν•˜λŠ” rsyslog κ·œμΉ™μ„ μž‘μ„±ν•˜μ„Έμš”: - λͺ¨λ“  auth λ©”μ‹œμ§€λ₯Ό /var/log/auth-all.log에 μ €μž₯ - "Failed" λ¬Έμžμ—΄μ΄ ν¬ν•¨λœ λ©”μ‹œμ§€λŠ” /var/log/failures.log에도 μ €μž₯ - 원격 μ„œλ²„ 192.168.1.100으둜 μ—λŸ¬ 이상 둜그 전솑

문제 3: logrotate μ„€μ •

/var/log/myapp/ λ””λ ‰ν† λ¦¬μ˜ λ‘œκ·Έμ— λŒ€ν•΄: - 맀일 μˆœν™˜ - 30일 보관 - 100MB 초과 μ‹œ μˆœν™˜ - xz μ••μΆ• - μˆœν™˜ ν›„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— SIGHUP 전솑


μ •λ‹΅

문제 1 μ •λ‹΅

# 1. nginx μ—λŸ¬ 둜그 (였늘)
journalctl -u nginx -p err --since today

# 2. PID 1234 JSON 좜λ ₯
journalctl _PID=1234 -o json-pretty

# 3. 컀널 κ²½κ³  이상 (1μ‹œκ°„)
journalctl -k -p warning --since "1 hour ago"

문제 2 μ •λ‹΅

# /etc/rsyslog.d/custom.conf

# auth 둜그
auth.*  /var/log/auth-all.log

# Failed 포함 λ©”μ‹œμ§€
:msg, contains, "Failed" /var/log/failures.log

# 원격 전솑 (μ—λŸ¬ 이상)
*.err @@192.168.1.100:514

문제 3 μ •λ‹΅

# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 30
    size 100M
    compress
    compresscmd /usr/bin/xz
    compressext .xz
    delaycompress
    missingok
    notifempty
    create 0644 root root
    postrotate
        [ -f /var/run/myapp.pid ] && kill -HUP $(cat /var/run/myapp.pid)
    endscript
}

λ‹€μŒ 단계


참고 자료

to navigate between lessons