레이블이 Debug-Log인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Debug-Log인 게시물을 표시합니다. 모든 게시물 표시

8/09/2020

systemd 의 logrotate 분석 과 Timer 사용법

1. systemd의 logrotate 기본구성 과 분석

syslog가 log 파일을 생성을 한다고 하면, 매번 Log를 주기적으로 backup을 하여 보관의 필요성을 느낄 것이며, 이를 위해서 사용되어지는 program이 logrotate이다 

만약 기본설치가 되어있다면, /etc/logrotate.conf 설정이 존재할 것이다. 
다만 logrotate가 자동으로 실행되는 program이 아니며, Linux Filesystem에 따라 sysvInit 일 경우는  cron 을 이용하여 주기적으로 호출되고, 
systemd일 경우는 timer를 이용하여 이를 주기적으로 호출되어 동작가능하다 


  • syslog 관련내용 
logrotate를 알기전에 syslogd에 대해 알자.
  https://ahyuo79.blogspot.com/2019/04/syslog.html


  • 기본설정파일 
  1. /etc/logrotate.conf  : 
  2. /etc/logrotate.d/btmp : 기본으로 설치됨 
  3. /etc/logrotate.d/wtmp


  • systemd의 timer 사용시 분석할 파일 
  1. /lib/systemd/system/logrotate.timer
  2. /lib/systemd/system/logrotate.service
  3. /etc/systemd/system/timers.target.wants/logrotate.timer  (Timer가 enable일 경우 존재)



1.1 logrotate 의 timer 와 service 분석 


  • logrotate 의 service 와 timer 분석

반드시 logrotate.service 와 logrotate.timer 의 prefix name이 logrotate.는 이름으로 동일해야 제대로 동작한다
logrotate.service는  logrotate.timer가 주기적으로 호출되어 를 구동하는 구조로 동작되어있기 때문에, systemd의 timer 현재 systemctl enable이 된 상태이다.


  • logrotate.timer 구조 파악  
분석으로 보면 매일 밤 12시, 즉 0시에 동작이 되며, Timer를 확인하는 주기는 12시간으로 정확성을 많이 떨어트리지만, Persistent를 이용

$ cat /lib/systemd/system/logrotate.timer 
[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)

[Timer]
OnCalendar=daily
AccuracySec=12h
Persistent=true

[Install]
WantedBy=timers.target
// systemctl enable logrotate.timer 할 경우  아래 link 생성됨
// systemctl disable logrotate.timer 할 경우 아래 link 제거됨

// timers.target.wants에 timer가 존재하는 것은 현재 enable 되는 상태
$ ls -al /etc/systemd/system/timers.target.wants/logrotate.timer
/etc/systemd/system/timers.target.wants/logrotate.timer -> /lib/systemd/system/logrotate.timerrotate.timer
$ systemctl status logrotate.timer // 매일 0시에 Trigger되어 동작함 $ systemctl is-enabled logrotate.timer // logrotate.timer enable enabled

systemd.timer 의 OnCalendar 설정정보 시간설정방법
onCalendar Time 설정을 보면 전부 0시기준으로 동작 
daily → *-*-* 00:00:00

시간동기화문제
OnCalendar 일반적으로 사용할 경우 time-sync.target 이후에 설정하도록 의존성을 넣는다고한다. 
  https://www.freedesktop.org/software/systemd/man/systemd.timer.html#Default%20Dependencies


기타 다른예제 (좋은예제)


  • 상위 timer에 의해 실행되는 logrotate.service 
기존의 Service 구조와 다르게 [Install] Section 이 없으며, *wants 및 에 위치 하지도 않는다
현재 systemctl disable logrotate.service 인 상태이지만 상위 timer가 구동을 시켜준다.

$ cat /lib/systemd/system/logrotate.service
[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
RequiresMountsFor=/var/log
ConditionACPower=true

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf

# performance options
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7

# hardening options
#  details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
#  no ProtectHome for userdir logs
#  no PrivateNetwork for mail deliviery
#  no ProtectKernelTunables for working SELinux with systemd older than 235
MemoryDenyWriteExecute=true
PrivateDevices=true
PrivateTmp=true
ProtectControlGroups=true
ProtectKernelModules=true
ProtectSystem=full
RestrictRealtime=true

$ systemctl status logrotate.service // logrotate.service 동작시간 확인 

$ systemctl is-enabled logrotate.service // logrotate.timer에 의해 동작 
static

1.2 logrotate 설정분석 


기본적으로 설정은 /etc/logrotate.conf에서 하지만, 확장설정이 가능하므로, 
아래와 같이 include를 사용하여 /etc/logrotate.d 안에 있는 존재하는 모든 파일도 허용한다

  • 기본설정구성 
$ cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# system-specific logs may be also be configured here.

mail command가 지원되며 e-mail에 log 정보도 같이 수신받을 수 있다. 

  • /var/log/btmp 설정 
실패한 Login 정보 (lastb 명령어로 확인)
$ cat /etc/logrotate.d/btmp
# no packages own btmp -- we'll rotate it here
/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

  • /var/log/wtmp 설정 
사용자의 Login/out과 시스템정보를 관리 (last 명령어로 확인)
$ cat /etc/logrotate.d/wtmp
# no packages own wtmp -- we'll rotate it here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    minsize 1M                # 상위 monthly 와 별개로 사이즈가 넘으면 rotate 
    rotate 1
}

last 와 lastb

  • /var/log/message 와 /var/log/test 설정 예 

$ cat /etc/logrotate.d/test1   // kill -HUP  syslogd 재시작 
/var/log/messages /var/log/test {
    missingok              ## 로그파일을 없어도, 에러없이 진행 (nomissingok 로그파일 없으면 에러발생 default) 
    monthly
    rotate 5
    dateext                ## 저장된 log에 날짜표시 
#   ifempty                ## ifempty 이 default (log파일 비어 있어도 rotate 진행)    
#   nosharedscripts        ## nosharedscripts 이 default 이며, 상위 /var/log/test*이면 여러개를 다 실행 
    postrotate             ## logroate가 실행된 후 script로 kill로 Signal 전송하여 Refresh 
        /bin/kill -HUP 'cat /var/run/syslogd.pid 2> /dev/null' 2> /dev/null
    endscript

$ kill -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS RTMIN RTMIN+1 RTMIN+2 RTMIN+3 RTMIN+4 RTMIN+5 RTMIN+6 RTMIN+7 RTMIN+8 RTMIN+9 RTMIN+10 RTMIN+11 RTMIN+12 RTMIN+13 RTMIN+14 RTMIN+15 RTMAX-14 RTMAX-13 RTMAX-12 RTMAX-11 RTMAX-10 RTMAX-9 RTMAX-8 RTMAX-7 RTMAX-6 RTMAX-5 RTMAX-4 RTMAX-3 RTMAX-2 RTMAX-1 RTMAX
## 1 -HUP SIGHUP  Refresh
##-2 INT  SIGINT Interrupt (Ctrl+C)
##-3 QUIT SIGQUIT Quit (Ctrl+z)  (이하 생략)

}

Process에 문제가 있어서 다시 시작하고자 할 때에는 SIGHUP, SIGTERM, SIGKILL
kill 명령어 
  https://ko.wikipedia.org/wiki/Kill
  https://en.wikipedia.org/wiki/SIGHUP


$ cat /etc/logrotate.d/test2   // kill -HUP  syslogd 재시작 
/var/log/test {
    missingok
    daily
    rotate 10
    dateext
    sharedscripts          ## sharedscripts /var/log/news/*  같이 log가 여러개 중복될때 한번만실행 
    postrotate
         /bin/kill -HUP 'cat /var/run/syslogd.pid 2> /dev/null' 2> /dev/null
    endscript
}

/var/log/messages {
    missingok
    daily
    rotate 20
    dateext    
    postrotate
        /bin/kill -HUP 'cat /var/run/syslogd.pid 2> /dev/null' 2> /dev/null
    endscript
}

$ cat /etc/logrotate.d/test3   // kill -HUP  syslogd 재시작 

/var/log/messages {
    rotate 3
    minsize 1M
    sharedscripts
    postrotate
        /bin/kill -HUP 'cat /var/run/syslogd.pid 2> /dev/null' 2> /dev/null
    endscript
}

$ cat /var/lib/logrotate.status  // 각 logroate가 된 후 상태확인 
logrotate state -- version 2
"/var/log/test" 2020-08-06-0:0:58
"/var/log/wtmp" 2020-07-10-11:0:0
"/var/log/btmp" 2020-07-10-11:0:0
"/var/log/message" 2020-07-10-11:0:0


logrotate(cron) and syslogd
  http://heart4u.co.kr/tblog/370
  



2. systemd 의 timer 사용방법


SysVinit에서는 cron을 사용했지만, systemd에서는 Timer를 사용해서 본인이 원하는 것을 주기적으로 실행해야하며, 
systemd의 timer는 monotonic timercalendar time(Realtime)으로 구분이되는데, 거의 monotonic timer를 많이 사용할 것이므로 아래로 처럼 구성한다


  • 현재 Timer 구성확인
$ systemctl list-timers   // Timer 상태확인 
or
$ systemctl list-timers --all | cat   // 모든 Timer 상태확인 (inactive timer 포함)
or
$ systemctl list-timers | cat
NEXT                         LEFT     LAST                         PASSED  UNIT                         ACTIVATES
Tue 2020-07-17 17:44:51 KST  7h left  Mon 2020-07-16 17:44:51 KST  16h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Wed 2020-07-18 00:00:00 KST  14h left Tue 2020-07-17 00:00:36 KST  9h ago  logrotate.timer              logrotate.service

  • monotonic timer 예제
 $ cat monotonic.timer   // booting 후 15분 후 동작후 매주 돌아가는 timer (미테스트)
[Unit]
Description=Run foo weekly and on boot

[Timer]
OnBootSec=15min
OnUnitActiveSec=1w 

[Install]
WantedBy=timers.target 

  • realtime timer 예제
 $ realtime.timer    // 일주일에 한번  12:00am on Monday 동작 (미테스트) 
[Unit]
Description=Run foo weekly

[Timer]
OnCalendar=weekly
Persistent=true

# Persistent          true이며, Timer가 실행한 서비스 Trigger정보를 Disk가 저장후 Timer가 동작할때, 즉각 Service 동작하도록 설정 

[Install]
WantedBy=timers.target

출처 

Realtime 으로 Monotonic Timer 구현 


2.1 systemd 의 TEST Timer 구성 


Timer를 잘 사용하기 위해서 monotonic timer 기반으로 구성 후 간단한 예제를 만들고, 이를 테스트 할 수 있는 shell script 와 함께 
내부의 환경변수 값들을 변경해보면 직접 테스트 진행. 

  • Test Timer 전체구성 
  1. /usr/bin/foo.sh 
  2. /lib/systemd/system/foo.timer
  3. /lib/systemd/system/foo.service 

  • timer로 실행될 service의 shell script 작성
$ vi /usr/bin/foo.sh   // 주기적으로 실행할 Shell Script 
#!/bin/sh
# Author: Jeonghun
#

WAIT_100MS() {
    sleep 0.1
}
# NOW 현재시간 
# UPTIME 은 부팅후 시간 측정용 1st arg (Booting 후 Sec)  2nd arg (Idle Time Sec) 
NOW=$(date +"%H:%M:%S")
UPTIME=`cat /proc/uptime`
echo -e "\x1b[1;93m *** TIMER $NOW  $UPTIME  \x1b[0m" > /dev/kmsg

$ chmod +x /usr/bin/foo.sh  // 실행권한 설정 

  • systemd 의 foo.timer 작성 (sample)
$ vi /etc/systemd/system/foo.timer
or
$ vi /lib/systemd/system/foo.timer
[Unit]
Description=Run 3 Secs foo timer from 1 min after boot

[Timer]
OnBootSec=1min
OnUnitActiveSec=3s
#OnActiveSec=3s

[Install]
WantedBy=timers.target

#
#
# [Timer] Section 
#
# 반드시 Monotonic Timer로 설정시 아래 설정을 포함을 해야하며, 중복 설정도 가능 
# OnActiveSec=, OnBootSec=, OnStartupSec=, OnUnitActiveSec=, OnUnitInactiveSec= 
# 
# 상위 설정을 한 후 세부 설정을 별도로 진행


$ systemctl enable foo.timer
Created symlink /etc/systemd/system/timers.target.wants/foo.timer → /etc/systemd/system/foo.timer.

$ ls -al /etc/systemd/system/timers.target.wants/foo.timer   // 생성된 링크확인 

  https://www.freedesktop.org/software/systemd/man/systemd.timer.html

  • systemd 의 timer 에 의해 실행될 service 설정
$ vi /etc/systemd/system/foo.service    
or
$ vi /lib/systemd/system/foo.service  // 상위 foo.timer에 의해 실행되므로 별도로 service 설정을 안해도 됨 
[Unit]
Description=TEST
Requires=local-fs.target
After=local-fs.target

[Service]
Type=simple
ExecStart=/usr/bin/foo.sh

Test Timer 구성참조
  https://coderoad.ru/9619362/%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA-a-cron-%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B5-30-%D1%81%D0%B5%D0%BA%D1%83%D0%BD%D0%B4 

AccuracySec=의 이해 

2.2 TEST(foo.timer) 설정 변경 테스트  

Timer의 설정의 의미를 알기 위해서 foo.timer의 설정값에 변경하여 개별 테스트 진행하며, 아래와 같이 그 결과도 알아본다.


  • foo.timer 수정 후 테스트 및 분석 (전체 2번실행)

[Timer]
OnBootSec=1min
OnActiveSec=3s
# OnBootSec          Booting 후 실행되는 Timer 설정 1분이며, OnStartupSec= 값도 동일하게 설정
# OnStartupSec       OnBootSec 거의 유사하지만 다른점은 service manager가 동작한 시점부터라고함 (아직 정확한 차이는 모름)
# OnActiveSec        Timer 자신이 Active 된 순간의 시간이라고 하는데,  
# AccuracySec        Timer를 확인하는 주기 미설정시 기본 1분 
// 1st TEST, 상위설정값 TEST 많이 다르며, 전체 2번만 동작  
 *** TIMER 14:55:59  14.64 0.77               // OnActiveSec 14초 Timer가 Active되는 순간 
 *** TIMER 14:56:55  70.89 47.92              // OnBootSec 70초 (AccuracySec 1분, 정확성이 떨어짐) 

// 2nd TEST, 상위설정값 TEST 많이 다르며, 전체 2번만 동작  
 *** TIMER 15:21:56  14.81 0.90
 *** TIMER 15:22:53  72.45 50.00              // OnBootSec 72초 (AccuracySec 1분, 정확성이 떨어짐) 

  • foo.timer 수정 후 테스트 및 분석 (전체 1번실행)

[Timer]
OnBootSec=1min
AccuracySec=3s
# AccuracySec        Timer를 확인하는 주기를 설정이며, 기본은 1분이지만,3초로 변경, 즉 정확성을 높임  
// 1st TEST 상위 설정값대로 동작하며, 전체 1번만 동작   
 *** TIMER 15:33:52  62.05 39.34                // OnBootSec 62초 (AccuracySec 3초 이내) 
 
// 2nd TEST 상위 설정값대로 동작하며, 전체 1번만 동작   
 *** TIMER 15:38:43  62.95 40.51                // OnBootSec 62초 (AccuracySec 3초 이내)       



  • foo.timer 수정 후 테스트 및 분석 (계속실행)
[Timer]
OnBootSec=1min
OnUnitActiveSec=3s
# OnBootSec          Booting 후 실행되는 Timer 설정 1분이며, OnStartupSec= 값도 동일하게 설정 
# OnUnitActiveSec    마지막(OnBootSec)에 Timer가 실행한 Unit(즉 서비스) Active가 되었을때 기준으로 3초 설정 
# AccuracySec        Timer를 확인하는 주기 미설정시 기본 1분 
// 1st TEST, 상위설정값과 많이 다르지만 계속동작                         
 *** TIMER 14:51:42  73.61 50.83           // OnBootSec 73초 (AccuracySec 때문에 정확성이 떨어짐) 
 *** TIMER 14:52:19  111.12 87.40          // OnUnitActiveSec 111-73= 38초 
 *** TIMER 14:52:43  134.63 110.23         // OnUnitActiveSec 134-111= 23초 
 *** TIMER 14:53:01  153.08 128.23         // OnUnitActiveSec 153-134= 19초 
 *** TIMER 14:53:19  171.37 146.09

// 2nd TEST, 상위설정값과 많이 다르지만 계속동작       
 *** TIMER 15:02:58  78.25 55.14            // OnBootSec 78초 
 *** TIMER 15:03:32  111.50 87.60
 *** TIMER 15:04:04  143.61 118.85
 *** TIMER 15:04:19  158.80 133.61
 *** TIMER 15:04:33  173.25 147.56


  • foo.timer 수정 후 테스트 및 분석 (계속실행)

[Timer]
OnBootSec=1min
OnUnitActiveSec=3s
AccuracySec=3s
# OnUnitActiveSec    마지막(OnBootSec)에 Timer가 실행한 Unit(즉 서비스) Active가 되었을때 기준으로 3초 설정 
# OnUnitInactiveSec  마지막(OnBootSec)에 Timer가 실행한 Unit(즉 서비스) inActive가 되었을때 기준으로 시간설정 
# AccuracySec        Timer를 확인하는 주기를 설정이며, 기본은 1분이지만,3초로 변경, 즉 정확성을 높임  
// 1st TEST 상위 설정값과 유사하게 동작 (3~6 초)   
 *** TIMER 15:14:11  60.66 37.90              // OnBootSec 60초 (AccuracySec 3초 이내) 
 *** TIMER 15:14:17  66.65 43.66              // OnUnitActiveSec 3초 (AccuracySec 3초 이내) 
 *** TIMER 15:14:21  70.65 47.49
 *** TIMER 15:14:27  76.65 53.23
 *** TIMER 15:14:31  80.65 57.03
 *** TIMER 15:14:37  86.64 62.80
 *** TIMER 15:14:41  90.64 66.65
 *** TIMER 15:14:47  96.65 72.41
 *** TIMER 15:14:51  100.64 76.23
 *** TIMER 15:14:57  106.65 81.98
 *** TIMER 15:15:01  110.64 85.82
 *** TIMER 15:15:07  116.65 91.63
 *** TIMER 15:15:11  120.65 95.41
 *** TIMER 15:15:14  123.70 98.31
 *** TIMER 15:15:20  129.65 103.99
 
// 2nd TEST 상위 설정값과 유사하게 동작 (3~6 초)   
 *** TIMER 15:18:38  62.95 40.17             // OnBootSec 62초 (AccuracySec 3초 이내) 
 *** TIMER 15:18:44  68.94 45.94             // OnUnitActiveSec 3초 (AccuracySec 3초 이내) 
 *** TIMER 15:18:50  74.94 51.72
 *** TIMER 15:18:54  78.95 55.56
 *** TIMER 15:19:00  84.95 61.33
 *** TIMER 15:19:04  88.95 65.16
 *** TIMER 15:19:10  94.95 70.94
 *** TIMER 15:19:14  98.94 74.77
 *** TIMER 15:19:20  104.94 80.57
 *** TIMER 15:19:24  108.94 84.39
 *** TIMER 15:19:30  114.95 90.17
 *** TIMER 15:19:34  118.94 94.01
 *** TIMER 15:19:40  124.94 99.87
 *** TIMER 15:19:44  128.95 103.73

  • foo.timer 수정 후 테스트 및 분석 (계속실행)

[Timer]
OnBootSec=1min
OnUnitActiveSec=1s
AccuracySec=3s
# OnUnitActiveSec    마지막(OnBootSec)에 Timer가 실행한 Unit(즉 서비스) Active가 되었을때 기준으로 1초 설정 
# AccuracySec        Timer를 확인하는 주기를 설정이며, 기본은 1분이지만,3초로 변경, 즉 정확성을 높임  
// 1st TEST 상위 설정값과 가장유사하게 동작 2-4초 간격   
 *** TIMER 15:27:55  61.66 38.97               // OnBootSec 61초 (AccuracySec 3초 이내) 
 *** TIMER 15:27:59  65.65 42.82               // OnUnitActiveSec 1초 (AccuracySec 3초 이내) 
 *** TIMER 15:28:03  69.65 46.64
 *** TIMER 15:28:05  71.66 48.50
 *** TIMER 15:28:09  75.65 52.26
 *** TIMER 15:28:13  79.65 56.07
 *** TIMER 15:28:15  81.65 57.98
 *** TIMER 15:28:19  85.65 61.80
 *** TIMER 15:28:23  89.66 65.65
 *** TIMER 15:28:25  91.65 67.52
 *** TIMER 15:28:29  95.65 71.35
 *** TIMER 15:28:33  99.66 75.17
 *** TIMER 15:28:35  101.65 77.06
 *** TIMER 15:28:39  105.65 80.92
 *** TIMER 15:28:43  109.65 84.74
 *** TIMER 15:28:45  111.65 86.63
 *** TIMER 15:28:49  115.66 90.47
 *** TIMER 15:28:53  119.65 94.29
 *** TIMER 15:28:55  121.66 96.18
 *** TIMER 15:28:59  125.66 99.99
 
// 2nd TEST 상위 설정값과 가장유사하게 동작   
 *** TIMER 15:30:39  63.05 40.48               // OnBootSec 63초 (AccuracySec 3초 이내) 
 *** TIMER 15:30:43  67.04 44.33               // OnUnitActiveSec 1초 (AccuracySec 3초 이내) 
 *** TIMER 15:30:47  71.04 48.17
 *** TIMER 15:30:50  74.04 51.06
 *** TIMER 15:30:54  78.04 54.87
 *** TIMER 15:30:58  82.04 58.69
 *** TIMER 15:30:59  83.30 59.84
 *** TIMER 15:31:03  87.04 63.42
 *** TIMER 15:31:07  91.04 67.23
 *** TIMER 15:31:10  94.04 70.10
 *** TIMER 15:31:14  98.04 73.91
 *** TIMER 15:31:18  102.04 77.74
 *** TIMER 15:31:20  104.04 79.61
 *** TIMER 15:31:24  108.04 83.43
 *** TIMER 15:31:28  112.04 87.29
 *** TIMER 15:31:30  114.04 89.20
 *** TIMER 15:31:34  118.04 93.01
 *** TIMER 15:31:38  122.04 96.81
 *** TIMER 15:31:40  124.04 98.69
 *** TIMER 15:31:42  126.39 100.92
 *** TIMER 15:31:46  130.04 104.45


2.3 systemd 의 timer 와 service 동시 설정


지금까지는 상위 service는 timer가 실행을 해줄 때까지 기다리고 동작을 했지만, service도 별도로 동작가능하도록 설정하여, 동시 설정하여 사용하자  

주로 이렇게 사용하는 이유는 booting 후 꼭 실행을 해야하는 경우가 될 것 같다. 


  • systemd의 timer 와 service 두개 중복 설정 
// 상위 foo.timer의 실행과 foo.service 독자적인 실행으로 중복실행방법  
$ vi /etc/systemd/system/foo.service    
or
$ vi /lib/systemd/system/foo.service  
[Unit]
Description=TEST
Requires=local-fs.target
After=local-fs.target

[Service]
Type=simple
ExecStart=/usr/bin/foo.sh

[Install]
WantedBy=multi-user.target

$ systemctl enable foo.service  // 이제 foo.service로도 동작가능 (timer가 죽어도 동작가능)  
Created symlink /etc/systemd/system/multi-user.target.wants/foo.service → /etc/systemd/system/foo.service.

$ ls -al /etc/systemd/system/multi-user.target.wants/foo.service   // 생성된 링크확인 


4/05/2020

Yocto 에서 syslogd/logrotate 와 Package 중복사용

1. syslogd 와 logrotate 관련 사항 

syslogd 관련이해
Yocto에 추가하기 전에 syslog를 먼저 이해하도록하자 


Yocto Recipe 작성방법 


Yocto에서 syslogd를 사용할 경우 일반적으로 busybox에 포함된 package로 많이 사용할 것이며, 그 기준으로 설명한다.

기본적으로 syslogd 와 logrotate 는 busybox에서 제공해주지만, 완벽한 기능이 아니라서 별도로 각가 설치를 해주면 된다. 

  • logrotate package 지원
busybox에서도 logrotate를 지원해주지만, logrotate package를 설치하는 것이 더 좋다 

IMAGE_INSTALL += "logrotate" 

  • rsyslogd or syslog-ng package 지원 
busybox의 syslogd가 기본지원이지만 확장하고자 하면 설정하며, ubuntu가 rsyslogd 사용하여 나중에 이것으로 사용
IMAGE_INSTALL += "rsyslog" 

1.1. busybox의 사용할 경우 한계


busybox의 syslogd의 경우 좀 특별하게 설정이 되며, 설정에 따라 rotate의 기능이 기본제공이 되며 아래와 같이 동작된다.
예를들면, 200K 기준으로 2개의 Message들을 보관하고 2개로 Rotate를 진행하는데, 이 부분은 아래의 소스를 참조
  1. /var/log/messages    (latest)
  2. /var/log/messages.0  (200k까지 보관)

busybox 소스에서 200K로 1번의 rotate가 가능하며, 이부분은 소스에서 직접수정가능

이 busybox의 rotate 기능은  logrotate기능과는 너무 부족하므로 , logrotate를 별도로 사용할 경우 사용중지하는 것이 맞을 것 같다. 

/var/log/messages.0 관련내용 
  https://www.unix.com/unix-for-dummies-questions-and-answers/183205-why-there-var-adm-messages-0-messages-1-messages-2-messages-3-a.html


  • busybox-syslogd 와 rotate 기능 소스분석 
busybox의 syslogd 소스를 분석을 해보면 아래와 같이 200K 저장되는 Logrotate기능이 내부에 별도로 존재한다.
busybox 말고 별도의 Logrotate Package를 사용하고자 하면 CONFIG_FEATURE_ROTATE_LOGFILE 부분을 막자

.........
//config:config SYSLOGD
//config:	bool "syslogd (13 kb)"
//config:	default y
//config:	help
//config:	The syslogd utility is used to record logs of all the
//config:	significant events that occur on a system. Every
//config:	message that is logged records the date and time of the
//config:	event, and will generally also record the name of the
//config:	application that generated the message. When used in
//config:	conjunction with klogd, messages from the Linux kernel
//config:	can also be recorded. This is terribly useful,
//config:	especially for finding what happened when something goes
//config:	wrong. And something almost always will go wrong if
//config:	you wait long enough....
//config:config FEATURE_ROTATE_LOGFILE
//config:	bool "Rotate message files"
//config:	default y
//config:	depends on SYSLOGD
//config:	help
//config:	This enables syslogd to rotate the message files
//config:	on his own. No need to use an external rotate script.
.........
typedef struct logFile_t {
	const char *path;
	int fd;
	time_t last_log_time;
#if ENABLE_FEATURE_ROTATE_LOGFILE
	unsigned size;
	uint8_t isRegular;
#endif
} logFile_t;
.....

#if ENABLE_FEATURE_ROTATE_LOGFILE      // LOG 사이즈 200K 확인 
 .logFileSize = 200 * 1024,
 .logFileRotate = 1,
#endif

......

ENABLE_FEATURE_ROTATE_LOGFILE 관련소스확인
  https://git.busybox.net/busybox/tree/sysklogd/syslogd.c

  • Yocto 의 Busybox 관련 Recipe 분석

$ find . -name busybox*bb*  // Yocto의 busybox recipe 모두 확인하며, 중복되면 Version 높은것만 확인  
./meta-fsl-bsp-release/imx/meta-bsp/recipes-core/busybox/busybox_%.bbappend  // 3. 최종 bbappend 확인  
./poky/meta/recipes-core/busybox/busybox_1.30.1.bb        // 1. Main busybox recipe 
./poky/meta/recipes-core/busybox/busybox-inittab_1.30.1.bb       // SysVinit 일 경우 /etc/inittab 사용, 미사용
./poky/meta-skeleton/recipes-core/busybox/busybox_%.bbappend
./poky/meta-poky/recipes-core/busybox/busybox_%.bbappend  // 2. Main busybox recipe의 bbappend 반드시 확인  

// 1.Main busybox recipe 기반으로 분석 및 관련 cfg 와 patch 확인
$ cat ./poky/meta/recipes-core/busybox/busybox_1.30.1.bb  
require busybox.inc

SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \
           file://busybox-udhcpc-no_deconfig.patch \
           file://find-touchscreen.sh \
           file://busybox-cron \
           file://busybox-httpd \
           file://busybox-udhcpd \
           file://default.script \
           file://simple.script \
           file://hwclock.sh \
           file://mount.busybox \
           file://syslog \
           file://syslog-startup.conf \
           file://syslog.conf \
           file://busybox-syslog.default \
           file://mdev \
           file://mdev.conf \
           file://mdev-mount.sh \
           file://umount.busybox \
           file://defconfig \
           file://busybox-syslog.service.in \
           file://busybox-klogd.service.in \
           file://fail_on_no_media.patch \
           file://run-ptest \
           file://inetd.conf \
           file://inetd \
           file://login-utilities.cfg \
           file://recognize_connmand.patch \
           file://busybox-cross-menuconfig.patch \
           file://0001-Use-CC-when-linking-instead-of-LD-and-use-CFLAGS-and.patch \
           file://mount-via-label.cfg \
           file://sha1sum.cfg \
           file://sha256sum.cfg \
           file://getopts.cfg \
           file://resize.cfg \
           ${@["", "file://init.cfg"][(d.getVar('VIRTUAL-RUNTIME_init_manager') == 'busybox')]} \
           ${@["", "file://mdev.cfg"][(d.getVar('VIRTUAL-RUNTIME_dev_manager') == 'busybox-mdev')]} \
           file://syslog.cfg \
           file://inittab \
           file://rcS \
           file://rcK \
           file://makefile-libbb-race.patch \
           file://0001-testsuite-check-uudecode-before-using-it.patch \
           file://0001-testsuite-use-www.example.org-for-wget-test-cases.patch \
           file://0001-du-l-works-fix-to-use-145-instead-of-144.patch \
           file://0001-dc.tests-fix-two-test-case-to-also-depend-on-DC_BIG.patch \
"
SRC_URI_append_libc-musl = " file://musl.cfg "

SRC_URI[tarball.md5sum] = "4f72fc6abd736d5f4741fc4a2485547a"
SRC_URI[tarball.sha256sum] = "3d1d04a4dbd34048f4794815a5c48ebb9eb53c5277e09ffffc060323b95dfbdc"

$ cat ./poky/meta-poky/recipes-core/busybox/busybox_%.bbappend // 2. Main busybox recipe의 bbappend 반드시 확인  
FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
///BPN 은 일반적으로 PN Package Name 의 Version 이라고 하는데 다만 prefix 와 suffix가 제거된상태 

$ ls ./poky/meta-poky/recipes-core/busybox/  // bbappend 에 적용되는 busybox directory 확인  
busybox  busybox_%.bbappend

// 3. 최종 bbappend 과 관련파일 반드시 확인  
$ cat ./meta-fsl-bsp-release/imx/meta-bsp/recipes-core/busybox/busybox_%.bbappend 

# look for files in the layer first
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

SRC_URI += "file://ftpget.cfg"

// Yocto의 경우 다른 *.cfg / *.patch 
$ ls ./poky/meta/recipes-core/busybox/busybox/


1.2. busybox의 logrotate 제거 

  • Busybox의 Config 설정변경 (Yocto)
기본 config에서 CONFIG_FEATURE_ROTATE_LOGFILE 설정제거(*.cfg 이용)
이미 IMAGE_INSTALL에 logrotate 추가했다면 상위 CONFIG를 제거

$ cat ./poky/meta-poky/recipes-core/busybox/busybox/poky-tiny/defconfig  // 기본 busybox Config
...
#
# System Logging Utilities
#
CONFIG_SYSLOGD=y
CONFIG_FEATURE_ROTATE_LOGFILE=y
CONFIG_FEATURE_REMOTE_LOG=y
CONFIG_FEATURE_SYSLOGD_DUP=y
CONFIG_FEATURE_SYSLOGD_CFG=y
CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256
CONFIG_FEATURE_IPC_SYSLOG=y
CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16
CONFIG_LOGREAD=y
CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y
CONFIG_KLOGD=y
CONFIG_FEATURE_KLOGD_KLOGCTL=y
CONFIG_LOGGER=y

// Recipe의 *.cfg의 추가 config가 존재한다면, 이 값에 따라 변경 (주의)
$ cat ./poky/meta/recipes-core/busybox/busybox/syslog.cfg 
CONFIG_SYSLOGD=y
# CONFIG_FEATURE_ROTATE_LOGFILE is not set
CONFIG_FEATURE_REMOTE_LOG=y
CONFIG_FEATURE_SYSLOGD_DUP=y
CONFIG_FEATURE_SYSLOGD_CFG=y
CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256
CONFIG_FEATURE_IPC_SYSLOG=y
CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=64
CONFIG_LOGREAD=y
CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y
CONFIG_FEATURE_KMSG_SYSLOG=y 

설정참고
  https://stackoverflow.com/questions/41868231/how-to-setup-syslog-in-yocto

  • syslog.conf 관련설정 부분 확인

$ find . -name syslog.conf
$ cat ./poky/meta/recipes-core/busybox/files/syslog.conf     // 이곳에서 /etc/syslog.conf 수정하면 적용됨
$ cat ./poky/meta/recipes-extended/sysklogd/files/syslog.conf  // /etc/syslog.conf 확장이라고 추정 

// sysVinit 일 경우, systemd만 사용할 경우는 제외(추후 확인)
$ cat ./poky/meta/recipes-core/busybox/files/syslog-startup.conf   
# This configuration file is used by the busybox syslog init script,
# /etc/init.d/syslog[.busybox] to set syslog configuration at start time.

DESTINATION=file  # log destinations (buffer file remote)
LOGFILE=/var/log/messages # where to log (file)
REMOTE=loghost:514  # where to log (syslog remote)
REDUCE=no   # reduce-size logging
DROPDUPLICATES=no  # whether to drop duplicate log entries
#ROTATESIZE=0   # rotate log if grown beyond X [kByte]
#ROTATEGENS=3   # keep X generations of rotated logs
BUFFERSIZE=64   # size of circular buffer [kByte]
FOREGROUND=no   # run in foreground (don't use!)
#LOGLEVEL=5   # local log level (between 1 and 8)


yocto 사용시 busybox syslogd 설정
  https://stackoverrun.com/ko/q/11519947


2. busybox 이외 Package 사용시 문제사항


Linux에서 필요한 기본 Util들을 다루며, Embedded에서는 대부분 BusyBox를 사용하지만, 좀 더 나은 binary를 사용하고자 하면, 
util-linux 와 각 Package들이 겹치고 다른 Package들과 겹치는 문제가 자주 생긴다. 


2.1 util-linux 와 busybox package 중복될 경우 

Yocto 내부에서 Package가 중복이 될 때 사용하는 class로 update-alternatives.class를 사용하며, 이 부분을 이해하자.

  • util-linux 의 Package List
Util Linux의 Package 관련사항 
  https://en.wikipedia.org/wiki/Util-linux


  • util-linux Package 추가 (중요)
대부분 Yocto에서 core-Image-base로 build 할 경우 util-linux를 미사용을 하는데, busybox대신 혹은 같이 사용할 경우 반드시 추가

IMAGE_INSTALL += "util-linux"


  • update-alternatives 관련사항
util-linux을 보면 동일한 프로그램이 여러 Package에서 중복 설치가 발생할 수 있으므로, 각각의 중복이 될 경우 대체(ALTERNATIVE)를 사용하여, 이를 해결하도록 한다.  

특히 busybox 와 binutils 와 util-linux 부분이 될 것 같으며, 이런 Package가 설치가 되어 중복이 되는 것을 피하기 위해서 이 class를 사용한다.
피하는 방법은 rename 방식으로 이를 link를 만들어 사용하는 것이므로 기본 사용법은 알아두자.
   
  ALTERNATIVE : 중복이 될 경우 대체가 될 command들을 기술 
  ALTERNATIVE_LINK_NAME: 중복이 되면 실제 위치들을 각 기술 
  ALTERNATIVE_PRIORITY: 중복이 되면, 이값을 각 기술하여 설치 우선순위 결정  
  ALTERNATIVE_TARGET: 기본으로 ALTERNATIVE_LINK_NAME값과 동일하며, 링크생성

Warrior(2.7)
Fido(1.8)



2.2 util-linux recipe 소스 분석 (intel)

먼저 IMAGE_INSTALL 에 util_linux가 추가되어있어야 동작가능하며,  busybox 설치되어있는 경우, 각 설정을 ALTERNATIVE로 설정  

  • util-linux 기본분석 (Intel Yocto)
  1. SRC_URI를 이용하여 util-linux 소스 download
  2. PACKAGES 에 사용하고자하는 util-linux-xxx PACKAGE들을 추가 
  3. FILE_util-linux-xxxx 사용할 PACKAGE들의 저장장소 설정 
  4. ALTERNATIVE_PRIORITY 전체 대체될 Package들 우선순위 busybox 조율 
  5. ALTERNATIVE_${PN} 안에 대체가 될 Package 들 기술
  6. ALTERNATIVE_util-linux-hwclock 상위와 동일하지만, PN 직접기술 
  7. ALTERNATIVE_LINK_NAME busybox 의 것들을 기술
  8. ALTERNATIVE_TARGET  default link를 생성하여 실제 사용결정   
Intel의 Yocto는 busybox 와 겹치는 경우 util-linux 실제 설정 


2.3 util-linux recipe 소스 분석 (poky)

먼저 IMAGE_INSTALL 에 util_linux가 추가되어있어야 동작하며, 기본소스를 보면 대체적으로, 이미 busybox 설치될 경우 util-linux로 대체됨 

  • Poky에서 util-linux 부분 분석
  1. SRC_URI를 이용하여 BP 즉 Base Recipe 이름과 동일하게 Download
  2. PACKAGES =+ "${PN}-swaponoff"  , 이 util-linux-swaponoff는 나중에 추가
  3. PACKAGES += "${@bb.utils.contains('PACKAGECONFIG', 'pylibmount', '${PN}-pylibmount', '', d)}"  는 util-linux-pylibmount  미리 추가 
  4. PACKAGE_PREPROCESS_FUNCS =+ "util_linux_binpackages "   python 함수 사용
  5. PACKAGESPLITFUNCS =+ "util_linux_libpackages"  python 함수 사용
  6. python 함수를 분석을 해봐도 PACKAGE는 두개만 사용함 

  • util_linux_binpackages 의 pkg_hook 함수 분석
  1. PACKAGE들을 읽어서 RRECOMMENDS_ 추가 (PACKAGE의 종속성문제)
  2. ALTERNATIVE_PN 가 존재하면 return 종료
  3. ALTERNATIVE_LINK_NAME 이 module 과 동일하면 ALTERNATIVE_PN 설정
    
  • util_linux_binpackages (말그대로 util-linux package 관리)
이상한 것은 PACKAGES do_split_packages로 구분관리하는것이 조금 이상하지만, 일단 이해만 하도록하자. 
.....
// 아래부터 시작되며, PACKAGES 대신 직접 함수로 Package 관리 
    bindirs = sorted(list(set(d.expand("${base_sbindir} ${base_bindir} ${sbindir} ${bindir}").split())))
    for dir in bindirs:
        do_split_packages(d, root=dir,
                          file_regex=r'(.*)', output_pattern='${PN}-%s',
                          description='${PN} %s',
                          hook=pkg_hook, extra_depends='')
    .......

  1. do_split_packages 함수 이용하여 PACKAGE관리하며, 매번 pkg_hook 호출 
  2. 중략
  3. 결론적으로 ALTERNATIVE를 비롯하여 FILE을 자동관리


추가시 busybox 대신 util-linux 용 package가 변경됨

12/29/2019

Terminal 색상설정

1. Terminal Color 설정 

ANSI escape code를 이용하여 Terminal의 Color다양한 변화를 줄 수 가 있다.
물론 개별 Terminal 마다 지원되는 부분이 다를 수 있으므로 주의하자

ANSI escape code는 ESC Key Code기반으로 Print를 이용하여 다양한 설정가능하며, 주로 내가 사용할 것은 CSI->SGR로 색상설정이다.

아래의 내용은 전부 Wiki에서 가져왔으며, 세부사항은 Wiki를 보도록하자.

ANSI_escape_code 정보
  https://en.wikipedia.org/wiki/ANSI_escape_code
  https://en.wikipedia.org/wiki/C0_and_C1_control_codes

Terminal color (색상정보 값 확인)
  https://misc.flogisoft.com/bash/tip_colors_and_formatting

1.1 Escape Sequences 

ESC (dec 27 / hex 0x1B / oct 033) 의 ESC 값을 기반으로 사용되지는 Sequences들을 말한다.
글자색상변화 하고 싶다면 아래의 CSI->SGR 로 설정을 하면된다.
이외에도 다양한 기능이 있으니, 아래의 표를 보고 알아두자.

Sequence C1 Short Name Effect
ESC N 0x8E SS2 Single Shift Two Select a single character from one of the alternative character sets.
In xterm, SS2 selects the G2 character set,
and SS3 selects the G3 character set.[19]
ESC O 0x8F SS3 Single Shift Three
ESC P 0x90 DCS Device Control String Terminated by ST. Xterm's uses of this sequence include
defining User-Defined Keys, and requesting or
setting Termcap/Terminfo data.[19]
ESC [ 0x9BCSI Control Sequence Introducer Most of the useful sequences, see next section.
ESC \ 0x9C ST String Terminator Terminates strings in other controls.[18]:8.3.143
ESC ] 0x9D OSC Operating System Command Starts a control string for the operating system to use,
terminated by ST.[18]:8.3.89 In xterm,
they may also be terminated by BEL.[19] In xterm,
the window title can be set by OSC 0;this is the window title BEL.
ESC X 0x98 SOS Start of String Takes an argument of a string of text, terminated by ST.
The uses for these string control sequences are defined by the application[18]:8.3.2,8.3.128
or privacy discipline.[18]:8.3.94 These functions are not implemented
and the arguments are ignored by xterm.[19]
ESC ^ 0x9E PM Privacy Message
ESC _ 0x9F APC Application Program Command
ESC c RIS Reset to Initial State Resets the device to its original state.
This may include (if applicable): reset graphic rendition,
clear tabulation stops, reset to default font, and more.[20]

  • CSI sequences
CSI (ESC [ ) 시작하는 CODE이며,  아래에서 사용되어지는 n, m 은 보통 숫자로 인식하지만, SGR의 경우 m은 문자로 사용

세부사항은 우측 Effect 부분을 참조
Code Short Name Effect
CSI n A CUU Cursor Up Moves the cursor n (default 1) cells in the given direction.
If the cursor is already at the edge of the screen, this has no effect.
CSI n B CUD Cursor Down
CSI n C CUF Cursor Forward
CSI n D CUB Cursor Back
CSI n E CNL Cursor Next Line Moves cursor to beginning of the line n (default 1) lines down. (not ANSI.SYS)
CSI n F CPL Cursor Previous Line Moves cursor to beginning of the line n (default 1) lines up. (not ANSI.SYS)
CSI n G CHA Cursor Horizontal Absolute Moves the cursor to column n (default 1). (not ANSI.SYS)
CSI n ; m H CUP Cursor Position Moves the cursor to row n, column m. The values are 1-based,
and default to 1 (top left corner) if omitted.
A sequence such as CSI ;5H is a synonym for CSI 1;5H
as well as CSI 17;H is the same as CSI 17H and CSI 17;1H
CSI n J ED Erase in Display Clears part of the screen.
If n is 0 (or missing), clear from cursor to end of screen.
If n is 1, clear from cursor to beginning of the screen.
If n is 2, clear entire screen (and moves cursor to upper left on DOS ANSI.SYS).
If n is 3, clear entire screen and delete all lines saved in the scrollback buffer
(this feature was added for xterm and is supported by other terminal applications).
CSI n KEL Erase in Line Erases part of the line.
If n is 0 (or missing), clear from cursor to the end of the line.
If n is 1, clear from cursor to beginning of the line.
If n is 2, clear entire line. Cursor position does not change.
CSI n SSU Scroll Up Scroll whole page up by n (default 1) lines.
New lines are added at the bottom. (not ANSI.SYS)
CSI n T SD Scroll Down Scroll whole page down by n (default 1) lines.
New lines are added at the top. (not ANSI.SYS)
CSI n ; m f HVP Horizontal Vertical Position Same as CUP, but counts as a format effector function (like CR or LF)
rather than an editor function (like CUD or CNL).[1]:AppA.1
This can lead to different handling in certain terminal modes.[18]:AnnexA
CSI n m SGR Select Graphic Rendition Sets the appearance of the following characters, see SGR parameters below.
CSI 5i AUX Port On Enable aux serial port usually for local serial printer
CSI 4i AUX Port Off Disable aux serial port usually for local serial printer
CSI 6n DSR Device Status Report Reports the cursor position (CPR) to the application as
(as though typed at the keyboard)
ESC[n;mR, where n is the row and m is the column.)

CSI를 시작으로 상위 명령들을 간단히 실행을 해보자


  • echo 기반으로 상위 적용 Simple 예제 
$ man echo
NAME
       echo - display a line of text

SYNOPSIS
       echo [SHORT-OPTION]... [STRING]...
       echo LONG-OPTION

DESCRIPTION
       Echo the STRING(s) to standard output.

       -n     do not output the trailing newline
       -e     enable interpretation of backslash escapes   // backslash를 이용하여 ESC Code를 사용 
       -E     disable interpretation of backslash escapes (default)

If -e is in effect, the following sequences are recognized:    // echo -e 했을 경우 backslash 사용하여 출력예제 
       \\     backslash              
       \a     alert (BEL)
       \b     backspace
       \c     produce no further output
       \e     escape
       \f     form feed
       \n     new line
       \r     carriage return
       \t     horizontal tab
       \v     vertical tab
       \0nnn  the character whose ASCII code is NNN (octal).  NNN can be 0 to 3 octal digits
       \xHH   the eight-bit character whose value is HH (hexadecimal).  HH can be one or two hex digits

// TEST Normal 
$ echo -e "TEST " 

// TEST CSI n J ( Erase in Display ) 
$ echo -e "\x1b[1J TEST " 

// TEST CSI n;m H (Cursor Position ) 
$ echo -e "\x1b[1;10H TEST " 


Linux command로 echo를 이용하여 색상 및 상위 명령어를 표현시에는 -e 옵션을 반드시 적용 


1.2 Terminal의 색상 설정변경 (CSI->SGR)

Terminal의 색상 설정 및 Blink를 비롯하여, Bold / Underline등 다양한 설정이 가능하다.
색상또한 본인이 원하면, 다양하게 설정이 가능하다.

  • SGR parameters (Set Graphics Rendition)
  1. CSI n m (ESC[ n m)로 동작되며, n값은 아래의 Code값 
  2. Color Table은 3종류로 선택가능하며,  3/4bit , 8 bit , 24 bit 모드로 동작가능  
Code Effect Note
0 Reset / Normal all attributes off
1 Bold or increased intensity
2 Faint (decreased intensity)
3 Italic Not widely supported. Sometimes treated as inverse.
4 Underline
5 Slow Blink less than 150 per minute
6 Rapid Blink MS-DOS ANSI.SYS; 150+ per minute; not widely supported
7 Reverse video swap foreground and background colors
8ConcealNot widely supported.
9Crossed-outCharacters legible, but marked for deletion.
10Primary(default) font
11–19Alternative fontSelect alternative font n − 10
20FrakturRarely supported
21Doubly underline or Bold offDouble-underline per ECMA-48.[26] See discussion
22Normal color or intensityNeither bold nor faint
23Not italic, not Fraktur
24Underline offNot singly or doubly underlined
25Blink off
27Inverse off
28Revealconceal off
29Not crossed out
30–37Set foreground colorSee color table below   3/4bit color 
38Set foreground colorNext arguments are 5;n or 2;r;g;b, see below
39Default foreground colorimplementation defined (according to standard)
40–47Set background colorSee color table below   3/4bit color 
48Set background colorNext arguments are 5;n or 2;r;g;b, see below
49Default background colorimplementation defined (according to standard)
51Framed
52Encircled
53Overlined
54Not framed or encircled
55Not overlined
60ideogram underline or right side lineRarely supported
61ideogram double underline or
double line on the right side
62ideogram overline or left side line
63ideogram double overline or
double line on the left side
64ideogram stress marking
65ideogram attributes offreset the effects of all of 6064
90–97Set bright foreground coloraixterm (not in standard)   3/4bit
100–107Set bright background coloraixterm (not in standard)   3/4bit

현재 내 Terminal은 Blink가 미동작하며, 각 Terminal마다 동작 사항은 다를 것 같다.
주로 많이 사용하는 모드는 3/4bit의 color 모드로 보면 가장 심플하게 적용하자.

  • 3/4 bit color 설정 및 Bold TEST 
  1. \x1b[1m  : Bold
  2. \x1b[93m : Bright Yellow  (3/4bit)
  3. \x1b[0m  : Reset 을 할 경우 상위 설정된 값들이 모두 초기화 

$ echo -e "\x1b[1m \x1b[93m TEST \x1b[0m" 


  • 3/4 bit color ";"를 사용하여 SGR를 동시적용 TEST  
  1. \x1b[1;93;4m  : Bold/Bright Yellow (3/4bit) /Underline
  2. \x1b[0m  : Reset

//Linux 에서 동시적용시
$ echo -e "\x1b[1;93;4;6m TEST \x1b[0m"   // Hex ESC 1: Bold , 93: Bright Yellow , 4: Underline 6: Rapid Blink 
$ echo -e "\033[1;93;4;6m TEST \033[0m"   // Oct ESC 상위동일 

//Bright foreground color (3/4 bit)  
$ echo -e "\x1b[1;90m TEST \x1b[0m" // Hex ESC 1: Bold , 90: Bright Black (Gray)
$ echo -e "\x1b[1;91m TEST \x1b[0m" // Hex ESC 1: Bold , 91: Bright Red
$ echo -e "\x1b[1;92m TEST \x1b[0m" // Hex ESC 1: Bold , 92: Bright Green
$ echo -e "\x1b[1;93m TEST \x1b[0m" // Hex ESC 1: Bold , 93: Bright Yellow
$ echo -e "\x1b[1;94m TEST \x1b[0m" // Hex ESC 1: Bold , 94: Bright Blue
$ echo -e "\x1b[1;95m TEST \x1b[0m" // Hex ESC 1: Bold , 95: Bright Magenta
$ echo -e "\x1b[1;96m TEST \x1b[0m" // Hex ESC 1: Bold , 96: Bright Cyan
$ echo -e "\x1b[1;97m TEST \x1b[0m" // Hex ESC 1: Bold , 97: Bright Whight

//Foreground color (3/4 bit) , 
$ echo -e "\x1b[1;30m TEST \x1b[0m" // Hex ESC 1: Bold , 30: Black 
$ echo -e "\x1b[1;31m TEST \x1b[0m" // Hex ESC 1: Bold , 31: Red
$ echo -e "\x1b[1;32m TEST \x1b[0m" // Hex ESC 1: Bold , 32: Green
$ echo -e "\x1b[1;33m TEST \x1b[0m" // Hex ESC 1: Bold , 33: Yellow
$ echo -e "\x1b[1;34m TEST \x1b[0m" // Hex ESC 1: Bold , 34: Blue
$ echo -e "\x1b[1;35m TEST \x1b[0m" // Hex ESC 1: Bold , 35: Magenta
$ echo -e "\x1b[1;36m TEST \x1b[0m" // Hex ESC 1: Bold , 36: Cyan
$ echo -e "\x1b[1;37m TEST \x1b[0m" // Hex ESC 1: Bold , 37: Whight


//Bell Sound, 
$ echo -e '\007'
$ echo -e '\a'

  https://rosettacode.org/wiki/Terminal_control/Ringing_the_terminal_bell

//Window Shell 인 CMD에서 실행 "\x"or "\033" 대신 Ctrl+[ 눌르면, "^[" 생성  
> echo ^[[1;93;4;6m TEST ^[[0m      // Hex ESC 1: Bold , 93: Bright Yellow , 4: Underline 6: Rapid Blink 
  https://stackoverflow.com/questions/2048509/how-to-echo-with-different-colors-in-the-windows-command-line

//Batch파일생성시 ESC Key 생성문제 때문에 아래와 같이 setESC사용 
setlocal
call :setESC


echo %ESC%[1;31m 
ECHO -----------------------------
ECHO ------     COLOR TEST
ECHO -----------------------------
echo %ESC%[0m

echo %ESC%[101;93m STYLES %ESC%[0m
echo %ESC%[0mReset%ESC%[0m
echo %ESC%[1mBold%ESC%[0m
echo %ESC%[4mUnderline%ESC%[0m
echo %ESC%[7mInverse%ESC%[0m
echo.
echo %ESC%[101;93m NORMAL FOREGROUND COLORS %ESC%[0m
echo %ESC%[30mBlack%ESC%[0m (black)
echo %ESC%[31mRed%ESC%[0m
echo %ESC%[32mGreen%ESC%[0m
echo %ESC%[33mYellow%ESC%[0m
echo %ESC%[34mBlue%ESC%[0m
echo %ESC%[35mMagenta%ESC%[0m
echo %ESC%[36mCyan%ESC%[0m
echo %ESC%[37mWhite%ESC%[0m
echo.
echo %ESC%[101;93m NORMAL BACKGROUND COLORS %ESC%[0m
echo %ESC%[40mBlack%ESC%[0m
echo %ESC%[41mRed%ESC%[0m
echo %ESC%[42mGreen%ESC%[0m
echo %ESC%[43mYellow%ESC%[0m
echo %ESC%[44mBlue%ESC%[0m
echo %ESC%[45mMagenta%ESC%[0m
echo %ESC%[46mCyan%ESC%[0m
echo %ESC%[47mWhite%ESC%[0m
echo.

PAUSE

:setESC
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set ESC=%%b
  exit /B 0
)
exit /B 0


  https://gist.github.com/mlocati/fdabcaeb8071d5c75a2d51712db24011

  • 8bit Color 적용방법 
ESC[ 38;5;⟨n⟩ m Select foreground color  (n : 0~255)
ESC[ 48;5;⟨n⟩ m Select background color  (n : 0~255)

  • 24bit Color 적용방법 (24bit까지 필요성은 현재 없어보임)
ESC[ 38;2;⟨r⟩;⟨g⟩;⟨b⟩ m Select RGB foreground color
ESC[ 48;2;⟨r⟩;⟨g⟩;⟨b⟩ m Select RGB background color

간단히 아래와 같이 Shell scirpt로 작성하여 출력

  • 8bit TEST Color Shell Script 
$ vi 8bitTestColor.sh 
#!/bin/bash

FOR=0
BAK=255

for((FOR=0,BAK=255;FOR<255;FOR++,BAK--)); do
    echo -e "\x1b[38:5:${FOR}m \x1b[48:5:${BAK}m TEST \x1b[0m"
done

$ chmod +x ./8bitTestColor.sh  
$ ./8bitTestColor.sh 


  • Python을 이용한 다양한 Color 설정
python에서도 동일하게 상위 정보기반으로 동일하게 적용가능
  http://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html

  • C언어 적용 및  TEST
$ vi color_test.c 
#include <stdio.h>

#define RST  "\x1B[0m"   // Normal Reset 
#define BLD  "\x1B[1m"   // Bold
#define BLK  "\x1B[30m"  // Black
#define RED  "\x1B[31m"  // Red
#define GRN  "\x1B[32m"  // Green
#define YEL  "\x1B[33m"  // Yellow
#define BLU  "\x1B[34m"  // Blue
#define MAG  "\x1B[35m"  // Magenta
#define CYN  "\x1B[36m"  // Cyan
#define WHT  "\x1B[37m"  // Light Gray

#define GRA  "\x1B[90m"  // Dark Gray
#define LRD  "\x1B[91m"  // Light RED
#define LGR  "\x1B[92m"  // Light Green
#define LYL  "\x1B[93m"  // Light Yellow
#define LBL  "\x1B[94m"  // Light Blue
#define LMA  "\x1B[95m"  // Light Magenta
#define LCY  "\x1B[96m"  // Light Cyan
#define LWH  "\x1B[97m"  // Whight

int main()
{
	//Color 
    printf("%s %s TEST MY Color %s \n", BLD,RED,RST);
    //Bell sound
    printf("\a");    
}

4/15/2019

syslog 와 rsyslog 설정

1. syslog 와 rsyslog

syslog는 linux에서 사용되어지는 application log system이며, 보통 klogd와 함께 사용되어진다.
그래서, klogd의 message와 호환이 되기 때문에 kernel message도 출력이 가능하다.

syslog는 기본으로 2가지 설정(Facility 와 Level)으로 구성이 되며, 여기에 추가적으로 tag도 별도로 첨부가 가능하여 
log 저장방법의 다양성을 제공해주고 있다.

  • Facility
Log message의 장치 및 source를 말하며, Facility Code or keyword로 쉽게 구분을 하여 본인이 원하는 message들을 log가 가능하다.
Facility code Keyword Description
0 kern Kernel messages
1 user User-level messages
2 mail Mail system
3 daemon System daemons
4 auth Security/authentication messages
5 syslog Messages generated internally by syslogd
6 lpr Line printer subsystem
7 news Network news subsystem
8 uucp UUCP subsystem
9 cron Clock daemon
10 authpriv Security/authentication messages
11 ftp FTP daemon
12 ntp NTP subsystem
13 security Log audit
14 console Log alert
15 solaris-cron Scheduling daemon
16–23 local0 – local7 Locally used facilities

  • Level
상위 Facility가 정해졌으며, 각 log의 Level을 설정이 가능하여, Message 양을 조절이 가능하다.
Value Severity Keyword Deprecated keywords Description
0 Emergency emerg panic[7] System is unusable
1 Alert alert Action must be taken immediately
2 Critical crit Critical conditions
3 Error err error[7] Error conditions
4 Warning warning warn[7] Warning conditions
5 Notice notice Normal but significant conditions
6 Informational info Informational messages
7 Debug debug Debug-level messages

syslog의 설정관련기본 정보(상위도표)
  https://en.wikipedia.org/wiki/Syslog

syslog의 kernel message는 klogd에서 전달받음

  • klogd
/proc/kmsg 에서 읽어서 syslogd 로 전송 

  • syslogd or rsyslogd 
/dev/log 를 사용하여 local에서 read 하며, network bind 514 port  


1.1 syslog의 설정 및 기본테스트 

syslog의 설정은 /etc/syslog.conf 이곳에서 설정이 되며, ps로 syslogd의 동작을 반드시 확인을 하자.
만약 미동작이라면, systemd or sysVinit 방식으로 syslogd를 실행을 시켜주자

  • syslog 설정 (/etc/syslog.conf)
$ vi /etc/rsyslog.conf    // 보통 내부에 include 사용하여 /etc/rsyslog.d/*.conf 확장 
or
$ vi /etc/rsyslog.d/*.conf   // rsyslogd 각 설정  (설정변경후 service restart, systemctl restart rsyslogd )

$ vi /etc/syslog.conf    // 보통 내부에 include 사용하여 /etc/syslog.d/*.conf 확장 
or
$ vi /etc/syslog.d/*.conf   // syslogd 각 설정  (설정변경후 service restart, systemctl restart syslogd ) 

#  /etc/syslog.conf     Configuration file for busybox's syslogd utility

########
#
# 
# 
# "*"    : Faclity or Severity level에서 사용 (모든 Faclity or Severity level) 
# "none" : Severity level에서만 사용          ( message를 미기록)
# ";"    ; 연속으로 
#  "="   ; Severity level의 정의하여 그 이상만 설정 
#  "@"   ; 외부 Server 
# 
#  facility.level;facility.level         logpath 
#  
#  /var/log/messages : default 저장되는 장소 (만약 설정을 안했다면, 기본으로 이곳에 저장)
#
# 
########

*.info;mail.none;news.none;authpriv.none       /var/log/messages

*.alert              root

local0.notice       /var/log/local0    

local1.*            /var/log/local1
local2.info         /var/log/local2

## console로 출력 
local3.*            /dev/console

local4.*            /var/log/test

# 해당 메시지를 192.168.1.17의 syslogd으로 전송 
local5.*            @192.168.1.17  
# 전송과 동시에 저장
local5.*            /var/log/local5           

# 해당 메시지를 jhleehost 의 syslogd으로 UDP 전송
local6.*            @jhleehost     
# 전송과 동시에 저장 
local6.*            /var/log/local6          

# 해당 메시지를 logserver 의 syslogd으로 전송
local7.*            @logserver     
# 전송과 동시에 저장 
local7.*            /var/log/local7          

syslog 와 rsyslog TCP/UDP 설정 ($UDPServerRun 514 , $InputTCPServerRun 514 )
  https://m.blog.naver.com/PostView.nhn?blogId=scvpark&logNo=221017723884&proxyReferer=https:%2F%2Fwww.google.com%2F

  • hostname 설정 및 변경 ( syslog에 반영)
$ cat /etc/hostname
jhleehost

$ cat /etc/hosts
127.0.0.1 localhost.localdomain           localhost
127.0.1.1 jhleehost
192.168.1.100  logserver

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters


  • syslog의 network 설정 
$ ps | grep syslog*  // 현재설정확인
  247 root      2724 S    /sbin/syslogd -n
  620 root      2724 S    grep syslog*
 

$ grep -r syslogd /lib/systemd/         //systemd 방식의 Service 찾기
/lib/systemd/system/busybox-syslog.service:ExecStart=/sbin/syslogd -n $OPTIONS

$ grep -r syslogd /etc/systemd/         //systemd 방식의 Service 찾기 (상위링크임)
/etc/systemd/system/syslog.service:ExecStart=/sbin/syslogd -n $OPTIONS
/etc/systemd/system/multi-user.target.wants/busybox-syslog.service:ExecStart=/sbin/syslogd -n $OPTIONS

$ vi /etc/init.d/sysklogd  //sysVinit 방식 
or
$ vi /lib/systemd/system/busybox-syslog.service //systemd 방식 

/sbin/syslogd –r –m 0 이용하여 원격Log Server 동작가능 (-r 옵션추가)

-r 옵션을 추가하면, logserver 기능이 추가되며, 외부의 Message를 받아 저장가능



syslogd 의 사용법 
/sbin/syslogd 에서 위치하며 상위 설정기반으로 Service 형태로 동작 
klogd 의 사용법
/sbin/klogd 에 대부분 위치하며, Kernel Message만 관리하며, Service 형태로 동작
syslogd를 걸쳐서 오는 것으로 보이며, syslogd가 더 중요 
  https://linux.die.net/man/8/klogd

/etc/syslog.conf 와 syslogd 관련정리내용
  https://www.linux.co.kr/lecture/lec_linux_01/lec-data/11data.pdf


1.2  logger로 syslog 테스트 

logger program을 이용하여 간단히 syslog를 테스트가 가능하며, 이를 이용하여 기록확인이 가능하다
  1. -p 옵션 : Facility 와 level 설정
  2. -t  옵션 : Tag  (별도의 본인의 Tag 설정)

상위 /etc/syslog.conf  설정변경 후 syslogd를  재실행 혹은 Reboot 후  아래와 같이 테스트 진행하며 
설정값(/etc/syslog.conf)을 변경하지 않는다면, 그대로 테스트 

  • /var/log/local0에 기록 (/etc/syslog.conf참조)
$ echo "hello local0" |  logger -t test_user0 -p local0.notice

$ cat /var/log/local0  //날짜 시간 hostname facility.level tag   message 
Mar 13 15:40:45 jhleehost local0.notice test_user0: hello local0


  • /var/log/local1에 기록
$ echo "hello local1" |  logger -t test_user1 -p local1.notice
$ cat /var/log/local1
Mar 13 15:45:50 jhleehost local1.notice test_user1: hello local1


  • /var/log/local2에 기록
$ echo "hello local2" |  logger -t test_user2 -p local2.info
$ cat /var/log/local2
Mar 13 15:49:31 jhleehost local2.info test_user2: hello local2


  • 바로 Consol 출력 미기록
$ echo "hello local3" |  logger -t test_user2 -p local3.info         
Mar 13 15:50:41 jhleehost local3.info test_user2: hello local3


  • Network로 Message 출력
$ echo "hello local5" |  logger -t test_user2 -p local5.info   
$ echo "hello local5" |  logger -t test_user2 -p local5.notice     
$ cat /var/log/message    //192.168.1.17로 기록 
.....
Mar 13 15:54:19 jhleehost local5.info test_user2: hello local5
Mar 13 15:56:24 jhleehost local5.notice test_user2: hello local5

$ cat /var/log/local5    // local로 기록 
Mar 13 16:05:57 jhleehost local5.info test_user2: hello local5
Mar 13 16:06:06 jhleehost local5.notice test_user2: hello local5


  • Shellscript 과 logger로 TEST진행
2>&1 을 이용하여 표준에러를 표준입력으로 변경하여 출력

$ test1.sh | logger -t test_1 -p local0.notice

$ test2.sh 2>&1 | logger -t test_2 -p local0.notice

2. syslog를 이용한 Programming 


Application에서 printf 대신 syslog를 이용하여 손쉽게 저장이 가능하며, 이를 이용하는 방식에 대해 간단히 요약한다.

2.1 syslog message format 방식 


syslog가 network도 지원이 되다보니, Protocol 방식이 존재하며, 더불어 TLS 같은 보안기능까지 지원가능 한 것으로 보인다.

  https://sematext.com/blog/what-is-syslog-daemons-message-formats-and-protocols/
  https://stackify.com/syslog-101/

  • syslogd의 실행 및 옵션 
  https://linux.die.net/man/3/syslog
  http://man7.org/linux/man-pages/man5/rsyslog.conf.5.html


2.2 언어 C를 사용하여 syslog 구현 

기본적으로 C에서 syslog를 이용하고 싶다면 아래와 같이 선언을 하고 build 진행

//Facility
#define LOG_KERN    (0<<3)  /* kernel messages */
#define LOG_USER    (1<<3)  /* random user-level messages */
#define LOG_MAIL    (2<<3)  /* mail system */
#define LOG_DAEMON  (3<<3)  /* system daemons */
#define LOG_AUTH    (4<<3)  /* security/authorization messages */
#define LOG_SYSLOG  (5<<3)  /* messages generated internally by syslogd */
#define LOG_LPR     (6<<3)  /* line printer subsystem */
#define LOG_NEWS    (7<<3)  /* network news subsystem */
#define LOG_UUCP    (8<<3)  /* UUCP subsystem */
#define LOG_CRON    (9<<3)  /* clock daemon */
#define LOG_AUTHPRIV    (10<<3) /* security/authorization messages (private) */
#define LOG_FTP     (11<<3) /* ftp daemon */
#define LOG_LOCAL0  (16<<3) /* reserved for local use */
#define LOG_LOCAL1  (17<<3) /* reserved for local use */
#define LOG_LOCAL2  (18<<3) /* reserved for local use */
#define LOG_LOCAL3  (19<<3) /* reserved for local use */
#define LOG_LOCAL4  (20<<3) /* reserved for local use */
#define LOG_LOCAL5  (21<<3) /* reserved for local use */
#define LOG_LOCAL6  (22<<3) /* reserved for local use */
#define LOG_LOCAL7  (23<<3) /* reserved for local use */

//Level
#define LOG_EMERG   0   /* system is unusable */
#define LOG_ALERT   1   /* action must be taken immediately */
#define LOG_CRIT    2   /* critical conditions */
#define LOG_ERR     3   /* error conditions */
#define LOG_WARNING 4   /* warning conditions */
#define LOG_NOTICE  5   /* normal but significant condition */
#define LOG_INFO    6   /* informational */
#define LOG_DEBUG   7   /* debug-level messages */



#include <syslog.h>

void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);

#include <stdarg .h>

void vsyslog(int priority, const char *format, va_list ap); 


#include <syslog.h>

int main()
{
     syslog(LOG_INFO|LOG_LOCAL1, "test local 0 \n");
     syslog(LOG_INFO|LOG_LOCAL2, "test local 1 \n");
     syslog(LOG_INFO|LOG_LOCAL3, "test local 2 \n");

     return 0;
}

Linux의 Application에서 직접 Syslog 사용할 경우 C의 예제 사용법 
  https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_1
3. syslog 기타사항 정리 



3.1 /var/log 의 검색방법 

/var/log/ 안에 다양한 log들이 존재할 것이며 정확한 Log를 분석하기 위해서 아래와 같이 날짜기반으로 검색하거나, 
혹은 Facility 와 각 Level 기반으로 검색 부터 Tag 를 사용하여 세부 검색을 이용하자 

  • grep를 이용하여 검색 후 분석 
$ grep "Feb 28 22:" /var/log/message  // 날짜기반으로 검색 
$ grep "Feb 28 22:" /var/log/message | head -n 100   // 날짜기반으로 검색 

$ grep "local0.notice" /var/log/message  // Facility 와 Level 기반으로 검색 
$ grep "local0.notice" /var/log/message | tail -n 100  // Facility 와 Level 기반으로 검색 

$ grep -e "local0.notice" -e "Feb 28 22:" /var/log/message  // 날짜기반에 Facility 와 Level 기반으로 검색 
$ grep -e "local0.notice" -e "Feb 28 22:" /var/log/message | tail -n 100  // 날짜기반에 Facility 와 Level 기반으로 검색  

  • grep/egrep/awk/sed 이용한 Pattern 검색
$ grep "PATTERN1\|PATTERN2" FILE
$ grep -E "PATTERN1|PATTERN2" FILE
$ grep -e PATTERN1 -e PATTERN2 FILE
$ egrep "PATTERN1|PATTERN2" FILE

$ awk '/PATTERN1|PATTERN2/' FILE

$ sed -e '/PATTERN1/b' -e '/PATTERN2/b' -e d FILE

grep 과 awk / sed 로 검색방법 
  https://www.shellhacks.com/grep-or-grep-and-grep-not-match-multiple-patterns/


3.2 rsyslog , syslog , syslog-ng 차이 


  • syslog 
1980년대에 시작되어 계속 개발중 
  1. UDP기반으로 syslog protocol 완성된 log관리 시스템 
  2. 상위 syslogd Manual 보면 Network은 UDP만 지원 

  • syslog-ng 
1988년에 syslog protocol 과 함께 시작되어 계속 개발중 
  1. content-based filtering  (Filter 기능을 제공하는 것으로 추측)
  2. Logging directly into a database ( Database 제공?)
  3. TCP for transport (UDP가 아닌 TCP로 안정화)
  4. TLS encryption (TLS 암호화까지 지원)

  • rsyslog
2004년에 syslog protocol 과 함께 시작되어 계속 개발중 
  1. RELP Protocol support
  2. Buffered operation support
  3. 상위 설정으로 봐서 TCP도 지원

결론적으로 각각 독립적으로 Open Source가 지원이 되는 것 같은데, 암호화 부분은 syslog-ng가 되어 낫을 것 같다. 


아래 링크 글을 보면 근본적으로 거의 차이가 없는 것(syslog protocol 모두 지원)으로 보이며, 하지만, 세부동작과 동작방식이 다른 것으로 보인다.

출처:
  https://serverfault.com/questions/692309/what-is-the-difference-between-syslog-rsyslog-and-syslog-ng


3.3 systemd-journal 의 사용법

기본적으로 Binary로 데이타를 저장하고 저장장소역시 이미 정해져있고, 현재 테스트만 해봤지만,  장점이 무엇인지 정확하게 모르겠음

추후 사용해보고 정리

systemd-journal 사용법
  https://haker.tistory.com/52
  https://www.loggly.com/ultimate-guide/linux-logging-with-systemd/


journal 이용방법
  https://serverfault.com/questions/573946/how-can-i-send-a-message-to-the-systemd-journal-from-the-command-line

3.4 rsyslog

현재 Ubuntu에서 syslogd 대신 사용하고 있으며, 추후 사용해보고 정리 
각 기능을 확인

  https://www.thegeekdiary.com/configuring-remote-logging-using-rsyslog-in-centos-rhel/
  http://pubs.opengroup.org/onlinepubs/007908799/xsh/syslog.h.html
  https://en.wikipedia.org/wiki/Syslog
  https://en.wikipedia.org/wiki/Rsyslog
  https://en.wikipedia.org/wiki/Reliable_Event_Logging_Protocol

정리해야할 사항들 및 참고사항
  https://cleverdj.tistory.com/130
  https://system-monitoring.readthedocs.io/en/latest/log.html
  http://apollo89.com/wordpress/?p=554
  https://en.wikipedia.org/wiki/Syslog
  https://haker.tistory.com/52

echo 'hello' | systemd-cat
journalctl -f


 https://serverfault.com/questions/573946/how-can-i-send-a-message-to-the-systemd-journal-from-the-command-line

journalctl -fu lora-start.service
  https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs

  https://www.freedesktop.org/software/systemd/man/systemd.html#

  https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_1
  https://www.joinc.co.kr/w/Site/system_programing/Unix_Env/syslog_2

  https://reebok.tistory.com/69

cron
  https://stackframe.tistory.com/14
  https://wiki.archlinux.org/index.php/Systemd/Timers