精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Tina Linux syslog使用指南

嵌入式Linux那些事 ? 來源:嵌入式Linux那些事 ? 作者:嵌入式Linux那些事 ? 2023-03-06 11:05 ? 次閱讀

Tina Linux syslog 使用指南

1 基本介紹

syslog 可以說是一套統(tǒng)一管理系統(tǒng)日志的機(jī)制,尤其常用于記錄守護(hù)進(jìn)程的輸出信息上。因?yàn)槭刈o(hù)進(jìn)程不存在控制終端,它的打印不能簡單地直接輸出到stdin 或stderr。

使用syslog 時,一般需要關(guān)注兩部分:syslog 守護(hù)進(jìn)程與syslog 函數(shù)。

1.1 syslog 守護(hù)進(jìn)程

syslog 守護(hù)進(jìn)程用于統(tǒng)一管理日志。它一般會創(chuàng)建一個數(shù)據(jù)報(SOCK_DGRAM )類型的Unix 域套接字(Unix domain socket),將其捆綁到/dev/log (不同的

系統(tǒng)可能會有所不同)。如果支持網(wǎng)絡(luò)功能,它可能還會創(chuàng)建一個UDP 套接字,并捆綁到端口514。syslog 守護(hù)進(jìn)程從這些套接字中讀取日志信息,然后再輸出到

設(shè)定的目標(biāo)位置(文件、串口等)。

后面提到的ubox 的logd 、busybox 的syslogd 、syslog-ng 都是syslog 守護(hù)進(jìn)程的不同實(shí)現(xiàn)。

1.2 syslog 函數(shù)

應(yīng)用程序若想將打印信息發(fā)送到syslog 守護(hù)進(jìn)程,就需要通過Unix 域套接字將信息輸出到syslog守護(hù)進(jìn)程綁定的路徑,標(biāo)準(zhǔn)的做法是通過調(diào)用syslog 函數(shù):

#include

void openlog(const char *ident, int option, int facility);

void syslog(int priority, const char *format, ...);

void closelog(void);

syslog 函數(shù)被應(yīng)用程序首次調(diào)用時,會創(chuàng)建一個Unix 域套接字,并連接到syslog 守護(hù)進(jìn)程的Unix 域套接字綁定的路徑名上。這個套接字會一直保持打開,直到進(jìn)

程終止為止。應(yīng)用程序也可以顯式地調(diào)用openlog 和closelog (這兩個函數(shù)都不是必須要調(diào)用的),如果不顯式調(diào)用,在第一次調(diào)用syslog 函數(shù)時會自動隱式地調(diào)

用openlog ,進(jìn)程結(jié)束后也會自動關(guān)閉與syslog 守護(hù)進(jìn)程通信的文件描述符,相當(dāng)于隱式調(diào)用closelog 。

以下是一些參數(shù)說明,更詳細(xì)的請參考syslog 的man 手冊。

1.2.1 openlog()

? ident 參數(shù)會被添加到每一條日志信息中,一般為程序的名字。

? option 參數(shù)支持以下的值,可通過或操作(OR)讓其支持多個option :

option 說明
LOG_CONS 若日志無法通過Unix 域套接字送到syslog 守護(hù)進(jìn)程,則將其輸出到 console
LOG_NDELAY 立即打開至syslog 守護(hù)進(jìn)程Unix 域套接字的連接,不要等到第一次調(diào)用 syslog 函數(shù)時才建立連接(通常情況下會在第一次調(diào)用syslog 時才建立連 接)
LOG_NOWAIT 不要等待在將消息計(jì)入日志過程中可能已經(jīng)創(chuàng)建的子進(jìn)程(GNU C 庫中不 會創(chuàng)建子進(jìn)程,因此該選項(xiàng)在Linux 中不會起作用)
LOG_ODELAYLOG_NDELAY 的相反,在第一次調(diào)用syslog 函數(shù)前不建立連接(這是默 認(rèn)的行為,可以不顯式指定該選項(xiàng))
LOG_PERROR 將日志信息也輸出到stderr
LOG_PID 在每條日志信息中添加上進(jìn)程ID

? facility 參數(shù)用于指定當(dāng)前應(yīng)用程序的設(shè)施類型,為后續(xù)的syslog 調(diào)用指定一個設(shè)施的默認(rèn)值。

該參數(shù)的存在意義是讓syslog 守護(hù)進(jìn)程可以通過配置文件對不同設(shè)施類型的日志信息做區(qū)分處理。如果應(yīng)用程序沒有調(diào)用openlog ,或是調(diào)用時facility 參數(shù)為0,

可在調(diào)用syslog 時將facility 作為priority 參數(shù)的一部分傳進(jìn)去。

facility 說明
LOG_AUTH 安全/授權(quán)信息
LOG_AUTHPRIV 安全/授權(quán)信息(私用)
LOG_CRON 定時相關(guān)的守護(hù)進(jìn)程(cron 和at )
LOG_DAEMON 系統(tǒng)守護(hù)進(jìn)程
LOG_FTP FTP 守護(hù)進(jìn)程
LOG_KERN 內(nèi)核信息(無法通過用戶空間的進(jìn)程產(chǎn)生)
LOG_LPT 行式打印機(jī)系統(tǒng)
LOG_MAIL 郵件系統(tǒng)
LOG_NEWS USENET 網(wǎng)絡(luò)新聞系統(tǒng)
LOG_SYSLOG 有syslog 守護(hù)進(jìn)程內(nèi)部產(chǎn)生的消息
LOG_USER 任意的用戶級消息(默認(rèn))
LOG_UUCP UUCP 系統(tǒng)

1.2.2 syslog()

priority 參數(shù)可以是上面提到的facility 與下面的level 的組合。level 的優(yōu)先級從高到低依次排序如下:

level 說明
LOG_EMERG 0 緊急(系統(tǒng)不可用)(最高優(yōu)先級)
LOG_ALERT 1 必須立即采取行動
LOG_CRIT 2 嚴(yán)重情況(如硬件設(shè)備出錯)
LOG_ERR 3 出錯情況
LOG_WARNING 4 警告情況
LOG_NOTICE 5 正常但重要的情況(默認(rèn)值)
LOG_INFO 6 通告信息
LOG_DEBUG 7 調(diào)試信息(最低優(yōu)先級)

1.3 rotate(轉(zhuǎn)存/輪轉(zhuǎn))

很多時候都會讓syslog 守護(hù)進(jìn)程讀取到的日志信息都寫入到某個文件中,隨著日志的增多,文件大小會不斷增大。為了避免日志文件將存儲空間占滿,需要限制日

志文件的大小并刪除過去的日志,該操作就稱為rotate(轉(zhuǎn)存/輪轉(zhuǎn))。

rotate 的實(shí)現(xiàn)一般如下:假設(shè)syslog 守護(hù)進(jìn)程將日志寫入到文件/var/run/messages,當(dāng)messages 文件大小超過設(shè)定值時,會將messages 中的日志信息保存到

別的文件中(假設(shè)名字為messages.0),然后清空messages 的內(nèi)容;當(dāng)下一次messages 文件的大小又超過設(shè)定值時,會再一次將messages 中的內(nèi)容保存為

messages.0,messages.0 中原有的內(nèi)容則保存為messages.1。如此類推,若干次之后就會存在messages、messages.0、messages.1、… 、messages.n 幾個

文件。一般會設(shè)置n 的最大值,超過該值的歷史文件就會被刪除,從而限制日志文件整體的大小。

我們可以自行編寫腳本實(shí)現(xiàn)rotate,可以使用專門的工具logrotate,另外有一些syslog 守護(hù)進(jìn)程的實(shí)現(xiàn)自帶有rotate 的功能,如ubox 的logread 、busybox 的

syslogd 。

2 syslog 相關(guān)軟件工具

2.1 ubox 的logd 與logread

ubox 是OpenWrt 的工具箱,它的syslog 系統(tǒng)由logd 與logread 兩個工具實(shí)現(xiàn)(此處的logread是ubox 自己的實(shí)現(xiàn),與下文busybox 提供的logread 不是同一個

工具)。

因?yàn)檫@兩個工具是OpenWrt 原生自帶,它們在使用上有可能會依賴于procd 和ubus ,目前尚未測試過在非procd init 的環(huán)境下是否可用。

使用procd init 時,它們通過開機(jī)腳本/etc/init.d/log 自啟動,具體如下:

#!/bin/sh /etc/rc.common

# Copyright (C) 2013 OpenWrt.org

# start after and stop before networking

START=12

STOP=89

PIDCOUNT=0

USE_PROCD=1

PROG=/sbin/logread

OOM_ADJ=-17

validate_log_section()

{

uci_validate_section system system "${1}"

'log_file:string'

'log_size:uinteger'

'log_ip:ipaddr'

'log_remote:bool:1'

'log_port:port:514'

'log_proto:or("tcp", "udp"):udp'

'log_trailer_null:bool:0'

'log_prefix:string'

}

validate_log_daemon()

{

uci_validate_section system system "${1}"

'log_size:uinteger:0'

'log_buffer_size:uinteger:0'

}

start_service_daemon()

{

local log_buffer_size log_size

validate_log_daemon "${1}"

[ $log_buffer_size -eq 0 -a $log_size -gt 0 ] && log_buffer_size=$log_size

[ $log_buffer_size -eq 0 ] && log_buffer_size=16

procd_open_instance

procd_set_param oom_adj $OOM_ADJ

procd_set_param command "/sbin/logd"

procd_append_param command -S "${log_buffer_size}"

procd_set_param respawn

procd_close_instance

}

start_service_file()

{

PIDCOUNT="$(( ${PIDCOUNT} + 1))"

local pid_file="/var/run/logread.${PIDCOUNT}.pid"

local log_file log_size

validate_log_section "${1}" || {

echo "validation failed"

return 1

}

[ -z "${log_file}" ] && return

procd_open_instance

procd_set_param command "$PROG" -f -F "$log_file" -p "$pid_file"

[ -n "${log_size}" ] && procd_append_param command -S "$log_size"

procd_close_instance

}

start_service_remote()

{

PIDCOUNT="$(( ${PIDCOUNT} + 1))"

local pid_file="/var/run/logread.${PIDCOUNT}.pid"

local log_ip log_port log_proto log_prefix log_remote log_trailer_null

validate_log_section "${1}" || {

echo "validation failed"

return 1

}

[ "${log_remote}" -ne 0 ] || return

[ -z "${log_ip}" ] && return

procd_open_instance

procd_set_param command "$PROG" -f -r "$log_ip" "${log_port}" -p "$pid_file"

case "${log_proto}" in

"udp") procd_append_param command -u;;

"tcp") [ "${log_trailer_null}" -eq 1 ] && procd_append_param command -0;;

esac

[ -z "${log_prefix}" ] || procd_append_param command -P "${log_prefix}"

procd_close_instance

}

service_triggers()

{

procd_add_reload_trigger "system"

procd_add_validation validate_log_section

}

start_service()

{

config_load system

config_foreach start_service_daemon system

config_foreach start_service_file system

config_foreach start_service_remote system

}

可見該腳本會通過config_load system 讀取配置,然后將配置作為logd 和logread 的選項(xiàng)參數(shù)。具體的配置位于文件/etc/config/system 中。

更為詳細(xì)的說明可參考OpenWrt 的官方文檔Runtime Logging in OpenWrt 以及Systemconfiguration /etc/config/system

2.1.1 logd

logd 維護(hù)著一個固定大小的ring buffer(環(huán)形緩沖區(qū)),用于保存收集到的日志(包括內(nèi)核的日志)。ring buffer 的大小通過-S 參數(shù)指定,可通過配

置/etc/config/system 中的log_buffer_size進(jìn)行修改,單位為KB。

2.1.2 logread

logread 用于讀取logd 的ring buffer 的內(nèi)容,并輸出到文件或網(wǎng)絡(luò)上的遠(yuǎn)程機(jī)器(通過TCP/UDP 套接字)。它支持的選項(xiàng)有如下:

Usage: logread [options]

Options:

-s Path to ubus socket

-l Got only the last 'count' messages

-e Filter messages with a regexp

-r Stream message to a server

-F Log file

-S Log size

-p PID file

-h Add hostname to the message

-P Prefix custom text to streamed messages

-f Follow log messages

-u Use UDP as the protocol

-0 Use ? instead of n as trailer when using TCP

? 直接執(zhí)行l(wèi)ogread 會將當(dāng)前ring buffer 中的日志全打印出來(類似于dmesg )。 ? 加上-f 則會持續(xù)地運(yùn)行著,并輸出ring buffer 中新的日志。 ? 使用-F "$log_file" 可指定將日志輸出到哪一個文件中,-S "$log_size" 可指定文件的大小,其中l(wèi)og_file 和log_size 都可在/etc/config/system 中進(jìn)行設(shè)置。(實(shí)測發(fā)現(xiàn)其自帶有rotate 的功能,當(dāng)log_file 的大小超過log_size 時,會加上“.0” 后綴轉(zhuǎn)存到同一個目錄下,默認(rèn)只保存一份歷史文件。暫未發(fā)現(xiàn)是否可配置保存超過一份的歷史轉(zhuǎn)存文件。)

2.2 busybox 的syslogd、klogd 與logread

busybox 自帶有一些syslog 工具,一般用到的主要為syslogd 、klogd 和logread (此處的logread與上文的ubox 的logread 不是同一個工具),均位于它

menuconfig 的“System LoggingUtilities” 下。

后文busybox 相關(guān)的內(nèi)容均基于1.27.2 版本進(jìn)行闡述。

2.2.1 syslogd

busybox 的syslogd 用于讀取/dev/log 中的日志,并決定將其發(fā)送到文件、共享內(nèi)存中的circular buffer 或網(wǎng)絡(luò)等位置,且其自帶有簡單的rotate 功能。

它支持的特性可在menuconfig 中進(jìn)行配置,將所有特性都選上后它支持的選項(xiàng)如下:

Usage: syslogd [OPTIONS]

System logging utility

-n Run in foreground

-R HOST[:PORT] Log to HOST:PORT (default PORT:514)

-L Log locally and via network (default is network only if -R)

-C[size_kb] Log to shared mem buffer (use logread to read it)

-K Log to kernel printk buffer (use dmesg to read it)

-O FILE Log to FILE (default: /var/log/messages, stdout if -)

-s SIZE Max size (KB) before rotation (default 200KB, 0=off)

-b N N rotated logs to keep (default 1, max 99, 0=purge)

-l N Log only messages more urgent than prio N (1-8)

-S Smaller output

-D Drop duplicates

-f FILE Use FILE as config (default:/etc/syslog.conf)

? 特性“Rotate message files”(FEATURE_ROTATE_LOGFILE)即為rotate 功能,對應(yīng) -s 指定日志文件的限制大小以及-b 指定保存多少份歷史的轉(zhuǎn)存文件。 ? 特性“Remote Log support”(FEATURE_REMOTE_LOG)即為網(wǎng)絡(luò)功能的支持,對應(yīng)-R和-L 選項(xiàng)。 ? 特性“Support -D (drop dups) option”(FEATURE_SYSLOGD_DUP)對應(yīng)-D 選項(xiàng),會丟棄掉內(nèi)容相同的重復(fù)日志。判斷日志是否相同不光看其主體信息,時間戳等附加的信息也會考慮在內(nèi),如“Jan 1 08:00:00 root: foobar” 和“Jan 1 08:00:01 root: foobar” 會被認(rèn)為是兩條不同的日志,只有完全相同的日志才會被丟棄掉。 ? 特性“Support syslog.conf”(FEATURE_SYSLOGD_CFG)支持使用配置文件,默認(rèn)為/etc/syslog.conf ,也可通過-f 指定其他的文件。可在配置文件中根據(jù)facility 與level 將日志輸出到不同的目標(biāo)位置,例子如下:

# 將所有日志輸出到文件/var/log/messages

?

*.* /var/log/messages

?

# 將所有日志輸出到console

*.* /dev/console

# 將facility 為LOG_KERN 的日志輸出到/var/log/kernel

kern.* /var/log/kernel

# 將facility 為LOG_USER 且level 高于LOG_NOTICE 的日志輸出到/var/log/user

user.notice /var/log/user

? 特性“Read buffer size in bytes”(FEATURE_SYSLOGD_READ_BUFFER_SIZE)用于設(shè)置syslogd 從/dev/log 中讀取內(nèi)容時的buffer 大小,它規(guī)定了單條日志消息的最大長度,超出的部分會被截斷丟棄掉。 ? 特性“Circular Buffer support”(FEATURE_IPC_SYSLOG)對應(yīng)-C[size_kb] 選項(xiàng),用于將日志送至共享內(nèi)存的circular buffer 中, 可以通過logread 讀取出來。circular buffer 的大小可通過“Circular buffer size in Kbytes (minimum 4KB)”(FEATURE_ IPC_SYSLOG_BUFFER_SIZE)進(jìn)行設(shè)置。 ? 特性“Linux kernel printk buffer support”(FEATURE_KMSG_SYSLOG)對應(yīng)-K 選項(xiàng),用于將日志輸出到Linux 內(nèi)核的printk buffer 中,可通過dmesg 讀取出來。 ? 剩余的一些選項(xiàng):-O 用于指定直接將日志輸出到哪個文件;-S 用于精簡日志消息,去除hostname、facility、level 等內(nèi)容,只保留時間戳、進(jìn)程名字以及消息的內(nèi)容部分。

注意:當(dāng)前版本的syslogd 中-f 、-C 、-O 幾個選項(xiàng)對應(yīng)的功能是沖突的,無法同時使用。相關(guān)部分的代碼如下(位于busybox/sysklogd/syslogd.c 的timestamp_and_log 函數(shù)中):

/* Log message locally (to file or shared mem) */

#if ENABLE_FEATURE_SYSLOGD_CFG

{

bool match = 0;

logRule_t *rule;

uint8_t facility = LOG_FAC(pri);

uint8_t prio_bit = 1 << LOG_PRI(pri);

for (rule = G.log_rules; rule; rule = rule->next) {

if (rule->enabled_facility_priomap[facility] & prio_bit) {

log_locally(now, G.printbuf, rule->file);

match = 1;

}

}

if (match)

return;

}

#endif

if (LOG_PRI(pri) < G.logLevel) {

#if ENABLE_FEATURE_IPC_SYSLOG

if ((option_mask32 & OPT_circularlog) && G.shbuf) {

log_to_shmem(G.printbuf);

return;

}

#endif

log_locally(now, G.printbuf, &G.logFile);

}

可見使能了配置文件的特性后(對應(yīng)宏ENABLE_FEATURE_SYSLOGD_CFG ),在讀取配置文件并將日志寫到目標(biāo)位置后就直接return 了,不會再執(zhí)行將日志輸出

到共享內(nèi)存區(qū)域(對應(yīng)宏ENABLE_FEATURE_IPC_SYSLOG )或直接輸出到某個文件(最后的那句log_locally(now, G.printbuf, &G.logFile) )的代碼。

2.2.2 syslog.conf

2.2.2.1 syslog.conf 的格式

syslog.conf 文件指明syslogd 程序紀(jì)錄日志的行為,該程序在啟動時查詢配置文件。

如果沒有改配置文件的話,默認(rèn)的會寫到/var/log/messages 中。

該文件由不同程序或消息分類的單個條目組成,每個占一行。對每類消息提供一個選擇域和一個動作域。這些域由tab 隔開:選擇域指明消息的類型和優(yōu)先級;動

作域指明syslogd 接收到一個與選擇標(biāo)準(zhǔn)相匹配的消息時所執(zhí)行的動作。每個選項(xiàng)是由設(shè)備和優(yōu)先級組成。當(dāng)指明一個優(yōu)先級時,syslogd 將紀(jì)錄一個擁有相同或

更高優(yōu)先級的消息。所以如果指明“crit”,那所有標(biāo)為crit、alert 和emerg 的消息將被紀(jì)錄。每行的行動域指明當(dāng)選擇域選擇了一個給定消息后應(yīng)該把他發(fā)送到哪

兒。

如下所示:

類型. 級別; 類型. 級別[TAB] 動作

2.2.2.2 類型facility:

保留字段中的“類型” 代表信息產(chǎn)生的源頭,可以是:

auth 認(rèn)證系統(tǒng),即詢問用戶名和口令

cron 系統(tǒng)定時系統(tǒng)執(zhí)行定時任務(wù)時發(fā)出的信息

daemon 某些系統(tǒng)的守護(hù)程序的syslog,如由in.ftpd產(chǎn)生的log

kern 內(nèi)核的syslog信息

lpr 打印機(jī)的syslog信息

mail 郵件系統(tǒng)的syslog信息

mark 定時發(fā)送消息的時標(biāo)程序

news 新聞系統(tǒng)的syslog信息

user 本地用戶應(yīng)用程序的syslog信息

uucp uucp子系統(tǒng)的syslog信息

local0..7 種本地類型的syslog信息,這些信息可以又用戶來定義

* 代表以上各種設(shè)備

2.2.2.3 級別priority:

保留字段中的“級別” 代表信息的重要性,可以是:

emerg 緊急,處于Panic狀態(tài)。通常應(yīng)廣播到所有用戶;

alert 告警,當(dāng)前狀態(tài)必須立即進(jìn)行糾正。例如,系統(tǒng)數(shù)據(jù)庫崩潰;

crit 關(guān)鍵狀態(tài)的警告。例如,硬件故障;

err 其它錯誤;

warning 警告;

notice 注意;非錯誤狀態(tài)的報告,但應(yīng)特別處理;

info 通報信息;

debug 調(diào)試程序時的信息;

none 通常調(diào)試程序時用,指示帶有none級別的類型產(chǎn)生的信息無需送出。如*.debug;mail.none表示調(diào)試時除

郵件信息外其它信息都送出。

2.2.2.4 動作action:

“動作” 域指示信息發(fā)送的目的地。可以是:

/filename 日志文件。由絕對路徑指出的文件名,此文件必須事先建立; @host 遠(yuǎn)程主機(jī); @符號后面可以是ip,也可以是域名,默認(rèn)在/etc/hosts文件下loghost這個別名已經(jīng)指 定給了本機(jī)。 user1,user2 指定用戶。如果指定用戶已登錄,那么他們將收到信息; * 所有用戶。所有已登錄的用戶都將收到信息。

2.2.2.5 具體實(shí)例:

我們來看看/etc/syslog.conf 文件中的實(shí)例:

…… *.err;kern.debug;daemon.notice;mail.crit [TAB] /var/adm/messages ……

這行中的“action” 就是我們常關(guān)心的那個/var/adm/messages 文件,輸出到它的信息源頭“selector”是: ? *.err - 所有的一般錯誤信息; ? kern.debug - 核心產(chǎn)生的調(diào)試信息; ? daemon.notice - 守護(hù)進(jìn)程的注意信息; ? mail.crit - 郵件系統(tǒng)的關(guān)鍵警告信息

例如,如果想把所有郵件消息紀(jì)錄到一個文件中,如下:

#Log all the mail messages in one place mail.* /var/log/maillog

其他設(shè)備也有自己的日志。UUCP 和news 設(shè)備能產(chǎn)生許多外部消息。它把這些消息存到自己的日志(/var/log/spooler)中并把級別限為“err” 或更高。例如:

# Save mail and news errors of level err and higher in aspecial file. uucp,news.crit /var/log/spooler

當(dāng)一個緊急消息到來時,可能想讓所有的用戶都得到。也可能想讓自己的日志接收并保存。

#Everybody gets emergency messages, plus log them on anther machine *.emerg * *.emerg @linuxaid.com.cn

alert 消息應(yīng)該寫到root 和tiger 的個人賬號中:

#Root and Tiger get alert and higher messages *.alert root,tiger

有時syslogd 將產(chǎn)生大量的消息。例如內(nèi)核(“kern” 設(shè)備)可能很冗長。用戶可能想把內(nèi)核消息紀(jì)錄到/dev/console 中。下面的例子表明內(nèi)核日志紀(jì)錄被注釋掉了:

#Log all kernel messages to the console #Logging much else clutters up the screen #kern.* /dev/console

用戶可以在一行中指明所有的設(shè)備。下面的例子把info 或更高級別的消息送到/var/log/messages,除了mail 以外。級別“none” 禁止一個設(shè)備:

#Log anything(except mail)of level info or higher #Don't log private authentication messages! *.info:mail.none;authpriv.none /var/log/messages

在有些情況下,可以把日志送到打印機(jī),這樣網(wǎng)絡(luò)入侵者怎么修改日志都沒有用了。通常要廣泛紀(jì)錄日志。Syslog 設(shè)備是一個攻擊者的顯著目標(biāo)。一個為其他主機(jī)

維護(hù)日志的系統(tǒng)對于防范服務(wù)器攻擊特別脆弱,因此要特別注意。有個小命令logger 為syslog(3)系統(tǒng)日志文件提供一個shell 命令接口,使用戶能創(chuàng)建日志文件

中的條目。 用法:logger 例如:logger This is a test! 它將產(chǎn)生一個如下的syslog 紀(jì)錄:Jan 1 00:08:49 TinaLinux user.notice root: this is a test!

2.2.3 klogd

busybox 的syslogd 無法直接獲取到內(nèi)核的日志信息,該功能需要通過klogd 實(shí)現(xiàn)。在運(yùn)行syslogd之后再運(yùn)行klogd 即可。

klogd 獲取內(nèi)核日志的方法有兩種:1) 通過klogctl() 接口;2) 通過/proc 或設(shè)備節(jié)點(diǎn)。選用哪種方法可通過menuconfig 中的“Use the klogctl()

interface”(FEATURE_KLOGD_KLOGCTL)進(jìn)行設(shè)置。

klogd 在獲取到內(nèi)核日志后,再通過syslog 函數(shù)將日志發(fā)送給syslog 守護(hù)進(jìn)程。

注意:

雖然klogd 是使用openlog("kernel", 0, LOG_KERN) ,但從源碼中的注釋來看,在glibc 中LOG_KERN 可能會被替換為LOG_USER ,因此在使用klogd 過程中需要

注意,內(nèi)核日志的facility 有可能為user而非kern。

2.2.4 logread

busybox 的logread 用于從syslogd 共享內(nèi)存的circular buffer 中讀取日志信息, 它需要syslogd 運(yùn)行時帶上-C[size_kb] 選項(xiàng), 并且需要關(guān)閉支持配置文件的特性(FEATURE_SYSLOGD_CFG)。

2.3 syslog-ng

syslog-ng 是syslog 守護(hù)進(jìn)程的又一種實(shí)現(xiàn),它本身并不依賴于ubox 或busybox,是一個獨(dú)立的應(yīng)用軟件。它支持更為豐富的配置項(xiàng),可以對日志進(jìn)行更為靈活

的處理。

syslog-ng 的配置文件為/etc/syslog-ng.conf , 詳細(xì)的語法可參考官方文檔https://www.syslog-ng.com/technical-documents/list/syslog-ng-open-source-edition ,下面是一份配置的例子:

@version:3.9 options { chain_hostnames(no); create_dirs(yes); flush_lines(0); keep_hostname(yes); log_fifo_size(256); log_msg_size(1024); stats_freq(0); flush_lines(0); use_fqdn(no); time_reopen(1); # 連接斷開后等待多少秒后重新建立連接(默認(rèn)為60 秒) keep_timestamp(no); # 不保存日志信息自帶的時間戳,用syslog-ng 收到該日志的時間作為時間戳 }; # 定義一個template,可使用template 對日志的各部分內(nèi)容進(jìn)行處理 # 使用了此處的template 的日志,會只顯示時間戳、日志頭部(程序名字等)以及主體信息, # 相比于默認(rèn)的日志信息會少了主機(jī)名 template t_without_hostname { template("${DATE} ${MSGHDR}${MESSAGE}n"); }; # 定義日志的source,即從哪里獲取日志 # 此處表示從syslog-ng 內(nèi)部以及通過Unix 數(shù)據(jù)報套接字從/dev/log 獲取日志 source src { internal(); unix-dgram("/dev/log"); }; # 從/proc/kmsg 中獲取內(nèi)核的日志 source kernel { file("/proc/kmsg" program_override("kernel")); }; # 定義日志的destination,即將日志送往哪里 # 此處表示將日志輸出到文件/var/log/messages,并使用剛剛定義的template 去掉主機(jī)名 destination messages { file("/var/log/messages" template(t_without_hostname)); }; # 將日志輸出到console,并使用剛剛定義的template 去掉主機(jī)名 destination console { file("/dev/console" template(t_without_hostname)); }; # 定義log,用于決定將哪些source 的日志送往哪些destination log { source(src); source(kernel); destination(messages); destination(console); };

直接執(zhí)行命令syslog-ng 即可運(yùn)行syslog-ng,下面是一個procd 式自啟動腳本的例子:

#!/bin/sh /etc/rc.common # Copyright (C) 2006-2016 OpenWrt.org START=50 STOP=99 USE_PROCD=1 start_service() { [ -f /etc/syslog-ng.conf ] || return 1 procd_open_instance procd_set_param command /usr/sbin/syslog-ng procd_close_instance } stop_service() { /usr/sbin/syslog-ng-ctl stop } reload_service() { stop start }

syslog-ng 自身并不具備rotate 的功能,無法限制日志文件的大小,一般會通過logrotate 或自行編寫腳本實(shí)現(xiàn)。

2.4 logrotate

logrotate 是專門用于對日志文件進(jìn)行rotate 的工具,支持將日志文件進(jìn)行壓縮、轉(zhuǎn)存到不同目錄等特性。

使用logrotate 時需要加上配置文件的路徑,如logrotate /etc/logrotate.conf ,配置文件的語法可

參考https://jlk.fjfi.cvut.cz/arch/manpages/man/logrotate.8

通常可在配置文件中使用include 命令將某個路徑下所有的配置文件都包含進(jìn)來,如在/etc/logrotate.conf 中加上一句include /etc/logrotate.d 可包

含/etc/logrotate.d 目錄下的配置文件,然后該目錄下可以按照不同應(yīng)用、不同日志文件對配置文件進(jìn)行區(qū)分,方便解耦。

以下是針對某一份日志文件進(jìn)行單獨(dú)配置的例子:

# 針對文件的/var/log/messages 的配置,花括號中的配置項(xiàng)可覆蓋全局配置 /var/log/messages { hourly # 每小時均進(jìn)行轉(zhuǎn)存(實(shí)測轉(zhuǎn)存周期小于一小時也可成功運(yùn)行, # 但如果設(shè)為daily、weekly 等貌似在轉(zhuǎn)存周期太短時會執(zhí)行失敗) size 2M # 文件在大于2M 時才會轉(zhuǎn)存 rotate 9 # 保存9 份歷史轉(zhuǎn)存日志文件 olddir /data # 被轉(zhuǎn)存的歷史日志文件會保存到/data 目錄下 createolddir # 若歷史日志文件的目標(biāo)目錄不存在則會自動創(chuàng)建 compress # 對歷史日志文件進(jìn)行壓縮(默認(rèn)使用gzip) copytruncate # 在轉(zhuǎn)存時對原始日志文件復(fù)制一份后再進(jìn)行截斷,對復(fù)制后的文件進(jìn)行轉(zhuǎn)存; # 而不是直接將原始日志文件移動到目標(biāo)路徑,避免原始日志文件的inode 發(fā)生變化。 }

注意事項(xiàng):

配置文件的權(quán)限需要為0644 或0444 ,否則logrotate 執(zhí)行時會有以下報錯:

error: Ignoring XXX because of bad file mode - must be 0644 or 0444.

logrotate 本身屬于單次執(zhí)行后就退出的應(yīng)用程序,并非守護(hù)進(jìn)程,需要借助其他守護(hù)進(jìn)程(如crond )定期來執(zhí)行。下面是/etc/crontabs/root 的一個示例,讓root 用戶每隔3 分鐘執(zhí)行一次logrotate :

*/3 * * * * /usr/sbin/logrotate /etc/logrotate.conf

一般都需要配置為copytruncate ,除非當(dāng)前使用的syslog 守護(hù)進(jìn)程支持重新打開日志文件的特性(如busybox 的syslogd 每秒都會重新打開日志文件),否則默認(rèn)logrotate 進(jìn)行rotate 時會直接對原始日志文件進(jìn)行重命名,再創(chuàng)建一個與原始日志文件同名的空白文件,此時日志文件雖然名字相同但inode 不同,而syslog 守護(hù)進(jìn)程還是繼續(xù)操作原本的inode,導(dǎo)致后續(xù)的日志沒有正確地寫入。

配置為copytruncate 時需要確保rotate 時刻剩余的可用空間大于原始日志文件的大小。因?yàn)閏opytruncate 需要先將日志文件復(fù)制一份后再進(jìn)行rotate,若剩余空間不足導(dǎo)致復(fù)制操作失敗,后續(xù)的整個rotate 過程也無法完成。

2.5 logger

logger 用于在shell 中向syslog 守護(hù)進(jìn)程發(fā)送消息,使用方法類似于echo 命令:

logger "foobar"

3 不同syslog 方案的對比

以下針對將本地syslog 日志寫入到本地文件中的這一需求,對不同的syslog 方案進(jìn)行對比。

3.1 ubox logd + logread

優(yōu)點(diǎn): ? OpenWrt 原生自帶,稍作配置即可使用。 ? 自帶獲取內(nèi)核日志以及簡單的rotate 功能。 ? 不同于busybox 的logread ,ubox 的logread 可同時支持將日志寫入文件和從ring buffer 中讀取日志的功能。

缺點(diǎn): ? 依賴于procd 與ubus 。(未測試過在缺少這兩者的情況下是否可用) ? rotate 功能只支持將日志文件轉(zhuǎn)存到相同目錄下,且只保存一份歷史文件,無壓縮功能。(未發(fā)現(xiàn)有配置項(xiàng)可進(jìn)行相關(guān)的設(shè)置)

3.2 busybox syslogd + klogd

優(yōu)點(diǎn): ? syslogd 自帶rotate 功能。在每次往文件寫入日志之前,都會先檢查文件大小是否已經(jīng)超過設(shè)定的上限值,若是,則執(zhí)行rotate 操作。因?yàn)槲募笮〉臋z查是在寫入日志的時候進(jìn)行,而非按一定的時間間隔進(jìn)行,可保證進(jìn)行rotate 時日志文件不會超出上限值很多。且因?yàn)閷懭肴罩九crotate 是在同一進(jìn)程中實(shí)現(xiàn),對日志文件進(jìn)行轉(zhuǎn)存時直接重命名即可,不需要再復(fù)制一份,在對剩余可用空間的限制上沒有l(wèi)ogrotate 的copytruncate 那么大。

? syslogd 會保證每秒都重新打開日志文件,不需要擔(dān)心文件的inode 改變,清空日志時可隨意刪除日志文件,新的日志文件在下一秒就能繼續(xù)正常地寫入日志。

缺點(diǎn):

? syslogd 本身不含獲取內(nèi)核日志的功能,需要額外運(yùn)行klogd 來支持。 ? syslogd 不支持自定義前綴、rotate 時壓縮的功能,且只能將日志文件轉(zhuǎn)存到同一個目錄下,無法自定義目標(biāo)路徑。 ? 將日志寫入到文件的同時無法使用logread 。

3.3 syslog-ng + logrotate

優(yōu)點(diǎn): ? syslog-ng 自身功能比較強(qiáng)大,可更為靈活地對日志進(jìn)行修改、過濾,且自身帶有獲取內(nèi)核日志的功能。 ? logrotate 能實(shí)現(xiàn)更為靈活的rotate 功能,如自定義目標(biāo)路徑、壓縮日志文件等。

缺點(diǎn): ? syslog-ng 本身無法監(jiān)視文件大小,無法通知logrotate 進(jìn)行rotate,只能依賴crond 等守護(hù)進(jìn)程定期地執(zhí)行l(wèi)ogrotate ,需要權(quán)衡好日志的增長速度和定期檢查的時間間隔,否則存儲空間有可能會被日志占滿。 ? 日志文件的inode 不能隨意地被改變,否則syslog-ng 可能無法正確地寫入日志。因此: ? logrotate 需要配置為copytruncate ,在rotate 時存在“復(fù)制文件” 這一過程,對剩余的存儲空間有一定的要求,否則rotate 過程會失敗。 ? 手動清空日志文件內(nèi)容時不能直接刪除日志文件,需要使用類似下面的命令:

echo > /var/log/messages

4 其他一些的注意事項(xiàng)

4.1 Unix 域套接字(Unix domain socket)是可靠的

syslog 是靠Unix 域套接字實(shí)現(xiàn)IPC(Inter-Process Communication,進(jìn)程間通信),協(xié)議族為AF_LOCAL (或AF_UNIX ),不管套接字的類型為字節(jié)流

(SOCK_STREAM )還是數(shù)據(jù)報(SOCK_DGRAM),它都是可靠的,在使用Unix 域套接字通信的過程中,如果讀操作一端阻塞且緩沖區(qū)滿了,寫操作的一端也同

樣會阻塞,在此過程中不會有數(shù)據(jù)被丟棄。

因此,當(dāng)syslog 守護(hù)進(jìn)程因?yàn)槟承┰蜃枞蜻\(yùn)行耗時變長時,若此時緩沖區(qū)已經(jīng)滿了,有可能會影響到調(diào)用syslog 函數(shù)的應(yīng)用程序的性能。應(yīng)用程序在設(shè)計(jì)時就

需要考慮syslog 函數(shù)可能的影響,不能無節(jié)制地使用syslog 函數(shù)進(jìn)行打印,也不能認(rèn)為它總會很快地就執(zhí)行完。

關(guān)于緩沖區(qū),應(yīng)該跟內(nèi)核的套接字設(shè)置有關(guān)。對于Unix 域數(shù)據(jù)報套接字,從測試結(jié)果來看/proc/sys/net/unix/max_dgram_qlen 會影響其緩沖區(qū)大小,但具體的

機(jī)制還不清楚。它的默認(rèn)值為10,可使用sysctl 進(jìn)行修改:

sysctl -w net.unix.max_dgram_qlen=XX

5 在Tina 中使用syslog

5.1 ubox 的logd 與logread

一般使用procd init 的方案都會默認(rèn)選上這兩個工具。

logd 由PACKAGE_logd 提供,menuconfig 中的位置為:

make menuconfig ---> Base system ---> <*> logd

Tina_Linux_syslog_Development_Guide-image-20230102174959204

?

圖5-1: logd 配置圖

?

logread 由PACKAGE_ubox 提供,menuconfig 中的位置為:

make menuconfig ---> Base system ---> <*> ubox

Tina_Linux_syslog_Development_Guide-image-20230102175031723

?

圖5-2: ubox 配置圖

?

它們的開機(jī)腳本/etc/init.d/log 由PACKAGE_logd 提供;配置項(xiàng)位于文件/etc/config/system 中,默認(rèn)由PACKAGE_base-files 提供,若想修改默認(rèn)的配置,可以在

target/allwinner/<方案名字>/base-files/etc/config/ 目錄下放置一份自定義的system 以覆蓋默認(rèn)的文件。

5.2 busybox 的syslogd、klogd 與logread

busybox 的syslog 工具在menuconfig 中的位置為:

make menuconfig ---> Base system ---> busybox ---> System Logging Utilities ---> [*] klogd *** klogd should not be used together with syslog to kernel printk buffer *** [*] Use the klogctl() interface [*] logger [*] logread [*] Double buffering [*] syslogd [*] Rotate message files [ ] Remote Log support [*] Support -D (drop dups) option [*] Support syslog.conf (256) Read buffer size in bytes [*] Circular Buffer support (4) Circular buffer size in Kbytes (minimum 4KB) [*] Linux kernel printk buffer support

對應(yīng)配置項(xiàng)的內(nèi)容請參考前文的章節(jié)。

busybox 的syslog 工具沒有自帶開機(jī)腳本,若想開機(jī)自啟需要自行編寫, 在rc.final 增加開機(jī)自啟動,如下:

#掛載sd卡 mount /dev/mmcblk0p1 /mnt/sdcard/ mkdir /mnt/sdcard/log #開啟rotate功能,每個log大小問4M,最多記錄10個 syslogd -s 4096 -b 10 & sleep 1 #同時記錄kernel的log klogd &

創(chuàng)建/etc/syslog.conf 文件,把log 文件記錄到sd 卡中,內(nèi)容如下:

*.* /mnt/sdcard/log/message

5.3 syslog-ng

syslog-ng 在menuconfig 中的位置為:

make menuconfig ---> Administration ---> <*> syslog-ng

Tina_Linux_syslog_Development_Guide-image-20230102175320862

?

圖5-3: syslog-ng 配置圖

?

它自帶有一份procd 式的開機(jī)腳本(會自動拷貝到小機(jī)端)以及一份配置文件的范例(不會自動拷貝到小機(jī)端),均位于package/admin/syslog-ng/files 目錄

下。可以參考配置文件范例syslog-ng.conf_example 自定義一份syslog-ng.conf 放到小機(jī)端的/etc 目錄下。

5.4 logrotate

logrotate 在menuconfig 中的位置為:

make menuconfig ---> Utilities ---> <*> logrotate

Tina_Linux_syslog_Development_Guide-image-20230102175409032

?

圖5-4: logrotate 配置圖

?

它自帶有一份配置文件logrotate.conf ,位于package/utils/logrotate/files 目錄下,會自動拷貝到小機(jī)端的/etc 目錄下。

配置文件帶有一些全局的配置項(xiàng),并且會include /etc/logrotate.d ,因此自定義的配置可放置在小機(jī)端的/etc/logrotate.d 目錄下,執(zhí)行l(wèi)ogrotate

/etc/logrotate.conf 時會被自動調(diào)用到(注意文件的權(quán)限需要為0644 或0444 )。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11230

    瀏覽量

    208933
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4307

    瀏覽量

    62433
  • 日志
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    10632
  • Tina
    +關(guān)注

    關(guān)注

    2

    文章

    45

    瀏覽量

    16957
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    202

    瀏覽量

    13947
收藏 人收藏

    評論

    相關(guān)推薦

    OpenRemoved_Tina_Linux系統(tǒng)調(diào)試使用指南

    本文主要服務(wù)于使用Tina軟件平臺的廣大客戶,幫助開發(fā)人員方便快速了解Tina平臺系統(tǒng)調(diào)試工具。
    的頭像 發(fā)表于 03-06 09:51 ?1224次閱讀

    Tina_Linux系統(tǒng)裁剪開發(fā)指南

    Tina_Linux系統(tǒng)裁剪開發(fā)指南1 概述2 Tina系統(tǒng)裁剪簡介2.1 boot0裁剪2.2 uboot裁剪2.3 內(nèi)核裁剪2.3.1 刪除不使用的功能2.3.2 刪除不使用的驅(qū)動2.3.3
    的頭像 發(fā)表于 03-06 09:52 ?1515次閱讀

    Vivado使用指南

    Vivado使用指南
    發(fā)表于 07-18 14:27

    PWM使用指南

    日期作者版本說明2020.09.26TaoV0.0撰寫中目錄簡要介紹常用配置設(shè)置更新中斷輸出PWM脈沖捕獲輸出帶死區(qū)控制的互補(bǔ)PWM使用指南簡要介紹常用配置設(shè)置更新中斷輸出PWM脈沖捕獲輸出帶死區(qū)控制的互補(bǔ)PWM使用指南...
    發(fā)表于 08-09 08:54

    Tina快速入門用戶指南

    這本用戶快速入門指南概要性的介紹了TINA-TI.一個強(qiáng)大的電路設(shè)計(jì)及仿真工具。TINA-TI是理想的用于對各種基本的和 高級的電路(具有復(fù)雜的結(jié)構(gòu)、沒有任何節(jié)點(diǎn)或器件數(shù)量的限制)進(jìn)行設(shè)計(jì)、測試和故障診斷的工具。本文檔的目的是,
    發(fā)表于 03-16 15:58 ?0次下載

    FreeRTOS 使用指南

    FreeRTOS 使用指南
    發(fā)表于 10-24 13:37 ?25次下載
    FreeRTOS <b class='flag-5'>使用指南</b>

    電子票使用指南免費(fèi)下載

    電子票使用指南電子票使用指南電子票使用指南電子票使用指南電子票使用指南電子票使用指南
    發(fā)表于 11-24 14:02 ?3次下載

    mast語言使用指南

    mast語言使用指南說明免費(fèi)下載。
    發(fā)表于 04-16 14:42 ?24次下載

    TINA-TI用戶指南

    這本用戶快速入門指南概要性的介紹了TINA-TI1M—一個強(qiáng)大的電路設(shè)計(jì)及仿真工具。TINA-TI是理想的用于對各種基本的和高級的電路(具有復(fù)雜的結(jié)構(gòu)、沒有任何節(jié)點(diǎn)或器件數(shù)量的限制)進(jìn)行設(shè)計(jì)、測試
    發(fā)表于 02-14 10:53 ?28次下載

    Tina_Linux_系統(tǒng)軟件開發(fā)指南

    Tina_Linux_系統(tǒng)軟件開發(fā)指南
    的頭像 發(fā)表于 03-02 15:25 ?1776次閱讀
    <b class='flag-5'>Tina_Linux</b>_系統(tǒng)軟件開發(fā)<b class='flag-5'>指南</b>

    Tina Linux配置開發(fā)指南

    Tina Linux配置開發(fā)指南
    的頭像 發(fā)表于 03-02 15:28 ?1.6w次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b>配置開發(fā)<b class='flag-5'>指南</b>

    Tina Linux圖形系統(tǒng)開發(fā)指南

    本文檔將介紹 Allwinner Tina Linux 中已經(jīng)移植好的窗口系統(tǒng),以及怎么使用,包括 MiniGUI、QT5、EFL、GTK+(WebkitGtk、Midori)、DirectFB、Wayland,整體結(jié)構(gòu) 。
    的頭像 發(fā)表于 03-06 11:00 ?3055次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b>圖形系統(tǒng)開發(fā)<b class='flag-5'>指南</b>

    Tina Linux音頻開發(fā)指南

    介紹Tina平臺音頻模塊的使用方法。
    的頭像 發(fā)表于 03-06 11:02 ?6254次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b>音頻開發(fā)<b class='flag-5'>指南</b>

    Tina Linux Key快速配置使用指南

    本文介紹Tina 平臺key 相關(guān)的快速配置和使用方法。
    的頭像 發(fā)表于 03-06 11:03 ?1289次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b> Key快速配置<b class='flag-5'>使用指南</b>

    Tina Linux PMU開發(fā)指南

    介紹使用Tina PMU 驅(qū)動的使用方法。
    的頭像 發(fā)表于 03-06 11:05 ?2016次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b> PMU開發(fā)<b class='flag-5'>指南</b>