Tina_Linux_syslog_使用指南

Tina Linux syslog 使用指南

1 基本介绍

syslog 可以说是一套统一管理系统日志的机制,尤其常用于记录守护进程的输出信息上。因为守护进程不存在控制终端,它的打印不能简单地直接输出到stdin 或

stderr。

使用syslog 时,一般需要关注两部分:syslog 守护进程与syslog 函数。

1.1 syslog 守护进程

syslog 守护进程用于统一管理日志。它一般会创建一个数据报(SOCK_DGRAM )类型的Unix 域套接字(Unix domain socket),将其捆绑到/dev/log (不同的

系统可能会有所不同)。如果支持网络功能,它可能还会创建一个UDP 套接字,并捆绑到端口514。syslog 守护进程从这些套接字中读取日志信息,然后再输出到

设定的目标位置(文件、串口等)。

后面提到的ubox 的logd 、busybox 的syslogd 、syslog-ng 都是syslog 守护进程的不同实现。

1.2 syslog 函数

应用程序若想将打印信息发送到syslog 守护进程,就需要通过Unix 域套接字将信息输出到syslog守护进程绑定的路径,标准的做法是通过调用syslog 函数:

#include <syslog.h>
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);

syslog 函数被应用程序首次调用时,会创建一个Unix 域套接字,并连接到syslog 守护进程的Unix 域套接字绑定的路径名上。这个套接字会一直保持打开,直到进

程终止为止。应用程序也可以显式地调用openlog 和closelog (这两个函数都不是必须要调用的),如果不显式调用,在第一次调用syslog 函数时会自动隐式地调

用openlog ,进程结束后也会自动关闭与syslog 守护进程通信的文件描述符,相当于隐式调用closelog 。

以下是一些参数说明,更详细的请参考syslog 的man 手册。

1.2.1 openlog()

• ident 参数会被添加到每一条日志信息中,一般为程序的名字。

• option 参数支持以下的值,可通过或操作(OR)让其支持多个option :

option说明
LOG_CONS若日志无法通过Unix 域套接字送到syslog 守护进程,则将其输出到
console
LOG_NDELAY立即打开至syslog 守护进程Unix 域套接字的连接,不要等到第一次调用
syslog 函数时才建立连接(通常情况下会在第一次调用syslog 时才建立连
接)
LOG_NOWAIT不要等待在将消息计入日志过程中可能已经创建的子进程(GNU C 库中不
会创建子进程,因此该选项在Linux 中不会起作用)
LOG_ODELAYLOG_NDELAY的相反,在第一次调用syslog 函数前不建立连接(这是默
认的行为,可以不显式指定该选项)
LOG_PERROR将日志信息也输出到stderr
LOG_PID在每条日志信息中添加上进程ID

• facility 参数用于指定当前应用程序的设施类型,为后续的syslog 调用指定一个设施的默认值。

该参数的存在意义是让syslog 守护进程可以通过配置文件对不同设施类型的日志信息做区分处理。如果应用程序没有调用openlog ,或是调用时facility 参数为0,

可在调用syslog 时将facility 作为priority 参数的一部分传进去。

facility说明
LOG_AUTH安全/授权信息
LOG_AUTHPRIV安全/授权信息(私用)
LOG_CRON定时相关的守护进程(cron 和at )
LOG_DAEMON系统守护进程
LOG_FTP FTP守护进程
LOG_KERN内核信息(无法通过用户空间的进程产生)
LOG_LPT行式打印机系统
LOG_MAIL邮件系统
LOG_NEWSUSENET 网络新闻系统
LOG_SYSLOG有syslog 守护进程内部产生的消息
LOG_USER任意的用户级消息(默认)
LOG_UUCPUUCP 系统

1.2.2 syslog()

priority 参数可以是上面提到的facility 与下面的level 的组合。level 的优先级从高到低依次排序如下:

level说明
LOG_EMERG0紧急(系统不可用)(最高优先级)
LOG_ALERT1必须立即采取行动
LOG_CRIT2严重情况(如硬件设备出错)
LOG_ERR3出错情况
LOG_WARNING4警告情况
LOG_NOTICE5正常但重要的情况(默认值)
LOG_INFO6通告信息
LOG_DEBUG7调试信息(最低优先级)

1.3 rotate(转存/轮转)

很多时候都会让syslog 守护进程读取到的日志信息都写入到某个文件中,随着日志的增多,文件大小会不断增大。为了避免日志文件将存储空间占满,需要限制日

志文件的大小并删除过去的日志,该操作就称为rotate(转存/轮转)。

rotate 的实现一般如下:假设syslog 守护进程将日志写入到文件/var/run/messages,当messages 文件大小超过设定值时,会将messages 中的日志信息保存到

别的文件中(假设名字为messages.0),然后清空messages 的内容;当下一次messages 文件的大小又超过设定值时,会再一次将messages 中的内容保存为

messages.0,messages.0 中原有的内容则保存为messages.1。如此类推,若干次之后就会存在messages、messages.0、messages.1、… 、messages.n 几个

文件。一般会设置n 的最大值,超过该值的历史文件就会被删除,从而限制日志文件整体的大小。

我们可以自行编写脚本实现rotate,可以使用专门的工具logrotate,另外有一些syslog 守护进程的实现自带有rotate 的功能,如ubox 的logread 、busybox 的

syslogd 。

2 syslog 相关软件工具

2.1 ubox 的logd 与logread

ubox 是OpenWrt 的工具箱,它的syslog 系统由logd 与logread 两个工具实现(此处的logread是ubox 自己的实现,与下文busybox 提供的logread 不是同一个

工具)。

因为这两个工具是OpenWrt 原生自带,它们在使用上有可能会依赖于procd 和ubus ,目前尚未测试过在非procd init 的环境下是否可用。

使用procd init 时,它们通过开机脚本/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_sizevalidate_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=16procd_open_instanceprocd_set_param oom_adj $OOM_ADJprocd_set_param command "/sbin/logd"procd_append_param command -S "${log_buffer_size}"procd_set_param respawnprocd_close_instance
}
start_service_file()
{PIDCOUNT="$(( ${PIDCOUNT} + 1))"local pid_file="/var/run/logread.${PIDCOUNT}.pid"local log_file log_sizevalidate_log_section "${1}" || {echo "validation failed"return 1}[ -z "${log_file}" ] && returnprocd_open_instanceprocd_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_nullvalidate_log_section "${1}" || {echo "validation failed"return 1}[ "${log_remote}" -ne 0 ] || return[ -z "${log_ip}" ] && returnprocd_open_instanceprocd_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 systemconfig_foreach start_service_daemon systemconfig_foreach start_service_file systemconfig_foreach start_service_remote system
}

可见该脚本会通过config_load system 读取配置,然后将配置作为logd 和logread 的选项参数。具体的配置位于文件/etc/config/system 中。

更为详细的说明可参考OpenWrt 的官方文档Runtime Logging in OpenWrt 以及Systemconfiguration /etc/config/system 。

2.1.1 logd

logd 维护着一个固定大小的ring buffer(环形缓冲区),用于保存收集到的日志(包括内核的日志)。ring buffer 的大小通过-S 参数指定,可通过配

置/etc/config/system 中的log_buffer_size进行修改,单位为KB。

2.1.2 logread

logread 用于读取logd 的ring buffer 的内容,并输出到文件或网络上的远程机器(通过TCP/UDP 套接字)。它支持的选项有如下:

Usage: logread [options]
Options:-s <path> Path to ubus socket-l <count> Got only the last 'count' messages-e <pattern> Filter messages with a regexp-r <server> <port> Stream message to a server-F <file> Log file-S <bytes> Log size-p <file> PID file-h <hostname> Add hostname to the message-P <prefix> Prefix custom text to streamed messages-f Follow log messages-u Use UDP as the protocol-0 Use \0 instead of \n as trailer when using TCP

• 直接执行logread 会将当前ring buffer 中的日志全打印出来(类似于dmesg )。
• 加上-f 则会持续地运行着,并输出ring buffer 中新的日志。
• 使用-F “ l o g f i l e " 可指定将日志输出到哪一个文件中, − S " log_file" 可指定将日志输出到哪一个文件中,-S " logfile"可指定将日志输出到哪一个文件中,S"log_size” 可指定文件的大小,其中log_file 和log_size 都可在/etc/config/system 中进行设置。(实测发现其自带有rotate 的功能,当log_file 的大小超过log_size 时,会加上“.0” 后缀转存到同一个目录下,默认只保存一份历史文件。暂未发现是否可配置保存超过一份的历史转存文件。)

2.2 busybox 的syslogd、klogd 与logread

busybox 自带有一些syslog 工具,一般用到的主要为syslogd 、klogd 和logread (此处的logread与上文的ubox 的logread 不是同一个工具),均位于它

menuconfig 的“System LoggingUtilities” 下。

后文busybox 相关的内容均基于1.27.2 版本进行阐述。

2.2.1 syslogd

busybox 的syslogd 用于读取/dev/log 中的日志,并决定将其发送到文件、共享内存中的circular buffer 或网络等位置,且其自带有简单的rotate 功能。

它支持的特性可在menuconfig 中进行配置,将所有特性都选上后它支持的选项如下:

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 功能,对应
-s 指定日志文件的限制大小以及-b 指定保存多少份历史的转存文件。
• 特性“Remote Log support”(FEATURE_REMOTE_LOG)即为网络功能的支持,对应-R和-L 选项。
• 特性“Support -D (drop dups) option”(FEATURE_SYSLOGD_DUP)对应-D 选项,会丢弃掉内容相同的重复日志。判断日志是否相同不光看其主体信息,时间戳等附加的信息也会考虑在内,如“Jan 1 08:00:00 root: foobar” 和“Jan 1 08:00:01 root: foobar” 会被认为是两条不同的日志,只有完全相同的日志才会被丢弃掉。
• 特性“Support syslog.conf”(FEATURE_SYSLOGD_CFG)支持使用配置文件,默认为/etc/syslog.conf ,也可通过-f 指定其他的文件。可在配置文件中根据facility 与level 将日志输出到不同的目标位置,例子如下:

# 将所有日志输出到文件/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)用于设置syslogd 从/dev/log 中读取内容时的buffer 大小,它规定了单条日志消息的最大长度,超出的部分会被截断丢弃掉。
• 特性“Circular Buffer support”(FEATURE_IPC_SYSLOG)对应-C[size_kb] 选项,用于将日志送至共享内存的circular buffer 中, 可以通过logread 读取出来。circular buffer 的大小可通过“Circular buffer size in Kbytes (minimum 4KB)”(FEATURE_
IPC_SYSLOG_BUFFER_SIZE)进行设置。
• 特性“Linux kernel printk buffer support”(FEATURE_KMSG_SYSLOG)对应-K 选项,用于将日志输出到Linux 内核的printk buffer 中,可通过dmesg 读取出来。
• 剩余的一些选项:-O 用于指定直接将日志输出到哪个文件;-S 用于精简日志消息,去除hostname、facility、level 等内容,只保留时间戳、进程名字以及消息的内容部分。

**注意:**当前版本的syslogd 中-f 、-C 、-O 几个选项对应的功能是冲突的,无法同时使用。相关部分的代码如下(位于busybox/sysklogd/syslogd.c 的timestamp_and_log 函数中):

/* 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;}
#endifif (LOG_PRI(pri) < G.logLevel) {
#if ENABLE_FEATURE_IPC_SYSLOGif ((option_mask32 & OPT_circularlog) && G.shbuf) {log_to_shmem(G.printbuf);return;}
#endiflog_locally(now, G.printbuf, &G.logFile);}

可见使能了配置文件的特性后(对应宏ENABLE_FEATURE_SYSLOGD_CFG ),在读取配置文件并将日志写到目标位置后就直接return 了,不会再执行将日志输出

到共享内存区域(对应宏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 程序纪录日志的行为,该程序在启动时查询配置文件。

如果没有改配置文件的话,默认的会写到/var/log/messages 中。

该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由tab 隔开:选择域指明消息的类型和优先级;动

作域指明syslogd 接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时,syslogd 将纪录一个拥有相同或

更高优先级的消息。所以如果指明“crit”,那所有标为crit、alert 和emerg 的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪

儿。

如下所示:

类型. 级别; 类型. 级别[TAB] 动作

2.2.2.2 类型facility:

保留字段中的“类型” 代表信息产生的源头,可以是:

auth 认证系统,即询问用户名和口令
cron 系统定时系统执行定时任务时发出的信息
daemon 某些系统的守护程序的syslog,如由in.ftpd产生的log
kern 内核的syslog信息
lpr 打印机的syslog信息
mail 邮件系统的syslog信息
mark 定时发送消息的时标程序
news 新闻系统的syslog信息
user 本地用户应用程序的syslog信息
uucp uucp子系统的syslog信息
local0..7 种本地类型的syslog信息,这些信息可以又用户来定义
\* 代表以上各种设备
2.2.2.3 级别priority:

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

emerg 紧急,处于Panic状态。通常应广播到所有用户;
alert 告警,当前状态必须立即进行纠正。例如,系统数据库崩溃;
crit 关键状态的警告。例如,硬件故障;
err 其它错误;
warning 警告;
notice 注意;非错误状态的报告,但应特别处理;
info 通报信息;
debug 调试程序时的信息;
none 通常调试程序时用,指示带有none级别的类型产生的信息无需送出。如*.debug;mail.none表示调试时除
邮件信息外其它信息都送出。
2.2.2.4 动作action:

“动作” 域指示信息发送的目的地。可以是:

/filename 日志文件。由绝对路径指出的文件名,此文件必须事先建立;
@host 远程主机; @符号后面可以是ip,也可以是域名,默认在/etc/hosts文件下loghost这个别名已经指
定给了本机。
user1,user2 指定用户。如果指定用户已登录,那么他们将收到信息;* 所有用户。所有已登录的用户都将收到信息。
2.2.2.5 具体实例:

我们来看看/etc/syslog.conf 文件中的实例:

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

这行中的“action” 就是我们常关心的那个/var/adm/messages 文件,输出到它的信息源头“selector”是:
• *.err - 所有的一般错误信息;
• kern.debug - 核心产生的调试信息;
• daemon.notice - 守护进程的注意信息;
• mail.crit - 邮件系统的关键警告信息

例如,如果想把所有邮件消息纪录到一个文件中,如下:

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

其他设备也有自己的日志。UUCP 和news 设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为“err” 或更高。例如:

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

当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。

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

alert 消息应该写到root 和tiger 的个人账号中:

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

有时syslogd 将产生大量的消息。例如内核(“kern” 设备)可能很冗长。用户可能想把内核消息纪录到/dev/console 中。下面的例子表明内核日志纪录被注释掉了:

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

用户可以在一行中指明所有的设备。下面的例子把info 或更高级别的消息送到/var/log/messages,除了mail 以外。级别“none” 禁止一个设备:

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

在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志都没有用了。通常要广泛纪录日志。Syslog 设备是一个攻击者的显著目标。一个为其他主机

维护日志的系统对于防范服务器攻击特别脆弱,因此要特别注意。有个小命令logger 为syslog(3)系统日志文件提供一个shell 命令接口,使用户能创建日志文件

中的条目。
用法:logger
例如:logger This is a test!
它将产生一个如下的syslog 纪录:Jan 1 00:08:49 TinaLinux user.notice root: this is a test!

2.2.3 klogd

busybox 的syslogd 无法直接获取到内核的日志信息,该功能需要通过klogd 实现。在运行syslogd之后再运行klogd 即可。

klogd 获取内核日志的方法有两种:1) 通过klogctl() 接口;2) 通过/proc 或设备节点。选用哪种方法可通过menuconfig 中的“Use the klogctl()

interface”(FEATURE_KLOGD_KLOGCTL)进行设置。

klogd 在获取到内核日志后,再通过syslog 函数将日志发送给syslog 守护进程。

注意:

虽然klogd 是使用openlog(“kernel”, 0, LOG_KERN) ,但从源码中的注释来看,在glibc 中LOG_KERN 可能会被替换为LOG_USER ,因此在使用klogd 过程中需要

注意,内核日志的facility 有可能为user而非kern。

2.2.4 logread

busybox 的logread 用于从syslogd 共享内存的circular buffer 中读取日志信息, 它需要syslogd 运行时带上-C[size_kb] 选项, 并且需要关闭支持配置文件的特性(FEATURE_SYSLOGD_CFG)。

2.3 syslog-ng

syslog-ng 是syslog 守护进程的又一种实现,它本身并不依赖于ubox 或busybox,是一个独立的应用软件。它支持更为丰富的配置项,可以对日志进行更为灵活

的处理。

syslog-ng 的配置文件为/etc/syslog-ng.conf , 详细的语法可参考官方文档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); # 连接断开后等待多少秒后重新建立连接(默认为60 秒)keep_timestamp(no); # 不保存日志信息自带的时间戳,用syslog-ng 收到该日志的时间作为时间戳
};
# 定义一个template,可使用template 对日志的各部分内容进行处理
# 使用了此处的template 的日志,会只显示时间戳、日志头部(程序名字等)以及主体信息,
# 相比于默认的日志信息会少了主机名
template t_without_hostname {template("${DATE} ${MSGHDR}${MESSAGE}\n");
};
# 定义日志的source,即从哪里获取日志
# 此处表示从syslog-ng 内部以及通过Unix 数据报套接字从/dev/log 获取日志
source src {internal();unix-dgram("/dev/log");
};
# 从/proc/kmsg 中获取内核的日志
source kernel {file("/proc/kmsg" program_override("kernel"));
};
# 定义日志的destination,即将日志送往哪里
# 此处表示将日志输出到文件/var/log/messages,并使用刚刚定义的template 去掉主机名
destination messages {
file("/var/log/messages" template(t_without_hostname));
};
# 将日志输出到console,并使用刚刚定义的template 去掉主机名
destination console {file("/dev/console" template(t_without_hostname));
};
# 定义log,用于决定将哪些source 的日志送往哪些destination
log {source(src);source(kernel);destination(messages);destination(console);
};

直接执行命令syslog-ng 即可运行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 1procd_open_instanceprocd_set_param command /usr/sbin/syslog-ngprocd_close_instance
}
stop_service() {/usr/sbin/syslog-ng-ctl stop
}
reload_service() {stopstart
}

syslog-ng 自身并不具备rotate 的功能,无法限制日志文件的大小,一般会通过logrotate 或自行编写脚本实现。

2.4 logrotate

logrotate 是专门用于对日志文件进行rotate 的工具,支持将日志文件进行压缩、转存到不同目录等特性。

使用logrotate 时需要加上配置文件的路径,如logrotate /etc/logrotate.conf ,配置文件的语法可

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

通常可在配置文件中使用include 命令将某个路径下所有的配置文件都包含进来,如在/etc/logrotate.conf 中加上一句include /etc/logrotate.d 可包

含/etc/logrotate.d 目录下的配置文件,然后该目录下可以按照不同应用、不同日志文件对配置文件进行区分,方便解耦。

以下是针对某一份日志文件进行单独配置的例子:

# 针对文件的/var/log/messages 的配置,花括号中的配置项可覆盖全局配置
/var/log/messages {hourly # 每小时均进行转存(实测转存周期小于一小时也可成功运行,# 但如果设为daily、weekly 等貌似在转存周期太短时会执行失败)size 2M # 文件在大于2M 时才会转存rotate 9 # 保存9 份历史转存日志文件olddir /data # 被转存的历史日志文件会保存到/data 目录下createolddir # 若历史日志文件的目标目录不存在则会自动创建compress # 对历史日志文件进行压缩(默认使用gzip)copytruncate # 在转存时对原始日志文件复制一份后再进行截断,对复制后的文件进行转存;# 而不是直接将原始日志文件移动到目标路径,避免原始日志文件的inode 发生变化。
}

注意事项:

  1. 配置文件的权限需要为0644 或0444 ,否则logrotate 执行时会有以下报错:
error: Ignoring XXX because of bad file mode - must be 0644 or 0444.
  1. logrotate 本身属于单次执行后就退出的应用程序,并非守护进程,需要借助其他守护进程(如crond )定期来执行。下面是/etc/crontabs/root 的一个示例,让root 用户每隔3 分钟执行一次logrotate :
*/3 * * * * /usr/sbin/logrotate /etc/logrotate.conf
  1. 一般都需要配置为copytruncate ,除非当前使用的syslog 守护进程支持重新打开日志文件的特性(如busybox 的syslogd 每秒都会重新打开日志文件),否则默认logrotate 进行rotate 时会直接对原始日志文件进行重命名,再创建一个与原始日志文件同名的空白文件,此时日志文件虽然名字相同但inode 不同,而syslog 守护进程还是继续操作原本的inode,导致后续的日志没有正确地写入。

  2. 配置为copytruncate 时需要确保rotate 时刻剩余的可用空间大于原始日志文件的大小。因为copytruncate 需要先将日志文件复制一份后再进行rotate,若剩余空间不足导致复制操作失败,后续的整个rotate 过程也无法完成。

2.5 logger

logger 用于在shell 中向syslog 守护进程发送消息,使用方法类似于echo 命令:

logger "foobar"

3 不同syslog 方案的对比

以下针对将本地syslog 日志写入到本地文件中的这一需求,对不同的syslog 方案进行对比。

3.1 ubox logd + logread

优点:
• OpenWrt 原生自带,稍作配置即可使用。
• 自带获取内核日志以及简单的rotate 功能。
• 不同于busybox 的logread ,ubox 的logread 可同时支持将日志写入文件和从ring buffer 中读取日志的功能。

缺点:
• 依赖于procd 与ubus 。(未测试过在缺少这两者的情况下是否可用)
• rotate 功能只支持将日志文件转存到相同目录下,且只保存一份历史文件,无压缩功能。(未发现有配置项可进行相关的设置)

3.2 busybox syslogd + klogd

优点:
• syslogd 自带rotate 功能。在每次往文件写入日志之前,都会先检查文件大小是否已经超过设定的上限值,若是,则执行rotate 操作。因为文件大小的检查是在写入日志的时候进行,而非按一定的时间间隔进行,可保证进行rotate 时日志文件不会超出上限值很多。且因为写入日志与rotate 是在同一进程中实现,对日志文件进行转存时直接重命名即可,不需要再复制一份,在对剩余可用空间的限制上没有logrotate 的copytruncate 那么大。

• syslogd 会保证每秒都重新打开日志文件,不需要担心文件的inode 改变,清空日志时可随意删除日志文件,新的日志文件在下一秒就能继续正常地写入日志。

缺点:

• syslogd 本身不含获取内核日志的功能,需要额外运行klogd 来支持。
• syslogd 不支持自定义前缀、rotate 时压缩的功能,且只能将日志文件转存到同一个目录下,无法自定义目标路径。
• 将日志写入到文件的同时无法使用logread 。

3.3 syslog-ng + logrotate

优点:
• syslog-ng 自身功能比较强大,可更为灵活地对日志进行修改、过滤,且自身带有获取内核日志的功能。
• logrotate 能实现更为灵活的rotate 功能,如自定义目标路径、压缩日志文件等。

缺点:
• syslog-ng 本身无法监视文件大小,无法通知logrotate 进行rotate,只能依赖crond 等守护进程定期地执行logrotate ,需要权衡好日志的增长速度和定期检查的时间间隔,否则存储空间有可能会被日志占满。
• 日志文件的inode 不能随意地被改变,否则syslog-ng 可能无法正确地写入日志。因此:
• logrotate 需要配置为copytruncate ,在rotate 时存在“复制文件” 这一过程,对剩余的存储空间有一定的要求,否则rotate 过程会失败。
• 手动清空日志文件内容时不能直接删除日志文件,需要使用类似下面的命令:

echo > /var/log/messages

4 其他一些的注意事项

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

syslog 是靠Unix 域套接字实现IPC(Inter-Process Communication,进程间通信),协议族为AF_LOCAL (或AF_UNIX ),不管套接字的类型为字节流

(SOCK_STREAM )还是数据报(SOCK_DGRAM),它都是可靠的,在使用Unix 域套接字通信的过程中,如果读操作一端阻塞且缓冲区满了,写操作的一端也同

样会阻塞,在此过程中不会有数据被丢弃。

因此,当syslog 守护进程因为某些原因阻塞或运行耗时变长时,若此时缓冲区已经满了,有可能会影响到调用syslog 函数的应用程序的性能。应用程序在设计时就

需要考虑syslog 函数可能的影响,不能无节制地使用syslog 函数进行打印,也不能认为它总会很快地就执行完。

关于缓冲区,应该跟内核的套接字设置有关。对于Unix 域数据报套接字,从测试结果来看/proc/sys/net/unix/max_dgram_qlen 会影响其缓冲区大小,但具体的

机制还不清楚。它的默认值为10,可使用sysctl 进行修改:

sysctl -w net.unix.max_dgram_qlen=XX

5 在Tina 中使用syslog

5.1 ubox 的logd 与logread

一般使用procd init 的方案都会默认选上这两个工具。

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 配置图

它们的开机脚本/etc/init.d/log 由PACKAGE_logd 提供;配置项位于文件/etc/config/system 中,默认由PACKAGE_base-files 提供,若想修改默认的配置,可以在

target/allwinner/<方案名字>/base-files/etc/config/ 目录下放置一份自定义的system 以覆盖默认的文件。

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

对应配置项的内容请参考前文的章节。

busybox 的syslog 工具没有自带开机脚本,若想开机自启需要自行编写, 在rc.final 增加开机自启动,如下:

#挂载sd卡
mount /dev/mmcblk0p1 /mnt/sdcard/
mkdir /mnt/sdcard/log
#开启rotate功能,每个log大小问4M,最多记录10个
syslogd -s 4096 -b 10 &
sleep 1
#同时记录kernel的log
klogd &

创建/etc/syslog.conf 文件,把log 文件记录到sd 卡中,内容如下:

*.* /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 式的开机脚本(会自动拷贝到小机端)以及一份配置文件的范例(不会自动拷贝到小机端),均位于package/admin/syslog-ng/files 目录

下。可以参考配置文件范例syslog-ng.conf_example 自定义一份syslog-ng.conf 放到小机端的/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 目录下,会自动拷贝到小机端的/etc 目录下。

配置文件带有一些全局的配置项,并且会include /etc/logrotate.d ,因此自定义的配置可放置在小机端的/etc/logrotate.d 目录下,执行logrotate

*.* /mnt/sdcard/log/message

5.3 syslog-ng

syslog-ng 在menuconfig 中的位置为:

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

[外链图片转存中…(img-Ht2yt40X-1677205584554)]

图5-3: syslog-ng 配置图

它自带有一份procd 式的开机脚本(会自动拷贝到小机端)以及一份配置文件的范例(不会自动拷贝到小机端),均位于package/admin/syslog-ng/files 目录

下。可以参考配置文件范例syslog-ng.conf_example 自定义一份syslog-ng.conf 放到小机端的/etc 目录下。

5.4 logrotate

logrotate 在menuconfig 中的位置为:

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

[外链图片转存中…(img-QeB1vkWK-1677205584555)]

图5-4: logrotate 配置图

它自带有一份配置文件logrotate.conf ,位于package/utils/logrotate/files 目录下,会自动拷贝到小机端的/etc 目录下。

配置文件带有一些全局的配置项,并且会include /etc/logrotate.d ,因此自定义的配置可放置在小机端的/etc/logrotate.d 目录下,执行logrotate

/etc/logrotate.conf 时会被自动调用到(注意文件的权限需要为0644 或0444 )。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38160.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux外壳程序编程 shell编程 引号详解

shell是命令语言、命令解释程序及程序设计语言的统称&#xff1b; shell是一个命令语言解释器&#xff0c;它拥有自己内建的shell命令&#xff1b; Shell&#xff08;Bash&#xff09;单引号、双引号和反引号用法详解; 尽量使用 $(命令) 的方式来引用命令的输出&#xff0c;…

【OS命令注入】常见OS命令执行函数以及OS命令注入利用实例以及靶场实验—基于DVWA靶场

目录 1 OS命令注入概述2 常见OS命令注入函数及例子2.1 system()函数2.2 exec()函数2.3 shell_exec()函数2.4 passthru()函数2.5 popen()函数2.6 反引号结构 3 OS命令注入漏洞的利用3.1 查看系统文件3.2 显示当前路径3.3 写文件 4 OS命令注入漏洞的防御5 OS命令注入漏洞靶场实验…

Linux —— tftp 使用

提示&#xff1a;tftp 命令在 uBoot 系统和 Linux 系统下的使用是不一样的 前言 在 Linux 移植过程或裸机开发中&#xff0c;经常要使用到 tftp 命令&#xff0c;本文围绕该命令相关的网络配置及使用做出记录&#xff0c;本文中&#xff0c;开发电脑命名为上位机&#xff0c;新…

linux 之TFTP的使用

简介 TFTP是用来下载远程文件的最简单网络协议&#xff0c;它其于UDP协议而实现。嵌入式linux的tftp开发环境包括两个方面&#xff1a;一是linux服务器端的tftp-server支持&#xff0c;二是嵌入式目标系统的tftp-client支持。因为u-boot本身内置支持tftp-client&#xff0c;所以…

嵌入式linux与windows之间的tftp文件传输(保姆级)

目录 前言一、为什么要文件传输二、利用共享文件夹(简要流程)三、tftp传输与环境搭建四、传输前的准备工作五、测试准备工作是否完成六、传输文件6.1、windows中tftp32的配置6.2、嵌入式Linux(板子)中获取或发送文件6.2.1、tftp命令用法 前言 在我们接触嵌入式Linux之前&#…

用于医疗领域的聊天机器人ChatDoctor

ChatGPT系列文章 文章目录 ChatGPT系列文章ChatDoctor数据集模型训练参考资料 ChatDoctor ChatDoctor: A Medical Chat Model Fine-tuned on LLaMA Model using Medical Domain Knowledge 论文地址&#xff1a;https://arxiv.org/pdf/2303.14070.pdf 在通用领域中的大型语言…

2021年中国互联网行业投融资运行现状及未来发展趋势分析[图]

互联网指的是网络与网络之间所串连成的庞大网络&#xff0c;这些网络以一组通用的协议相连&#xff0c;形成逻辑上的单一巨大国际网络。 一、全球互联网行业投融资运行现状 国际环境更趋复杂严峻&#xff0c;世界经济复苏放缓&#xff0c;通胀压力上升与疫情蔓延交织。2021年…

2021年中国企业风险投资发展现状及未来发展趋势分析[图]

企业风险投资是指有明确主营业务的非金融企业在其内部和外部所进行的风险投资活动。企业从事风险投资的形式主要有两种&#xff1a;一种是把用于风险投资的资金委托给专业的风险投资公司进行管理&#xff0c;由其成立的投资基金根据委托方的战略需要选择投资目标&#xff1b;另…

最强对话模型 ChatGPT 向 Google 搜索发起挑战

GPT-3 发布的两年后&#xff0c;我们没等来它的亲弟弟 GPT-4&#xff0c;而是在今天亲眼见证了 OpenAI 带来了一种全新的 AI 聊天机器人——ChatGPT&#xff0c;也可以称之为是 GPT-3 家族里面的亲戚&#xff0c;它不仅可以解释代码、编写情景喜剧脚本&#xff0c;也可以为用户…

Google 新一代音乐识别

文 / Google AI 苏黎世办公室 James Lyon 2017 年&#xff0c;我们发布了具有闻曲知音功能的 Pixel 2&#xff0c;就是利用深度神经网络为移动设备带来低功耗、始终开启的音乐识别功能。在开发 “闻曲知音” 时&#xff0c;我们的目标是打造一个小巧高效的音乐识别器&#xff0…

谷歌AudioLM :通过歌曲片段生成后续的音乐

AudioLM 是 Google 的新模型&#xff0c;能够生成与提示风格相同的音乐。该模型还能够生成复杂的声音&#xff0c;例如钢琴音乐或人的对话。结果是它似乎与原版没有区别&#xff0c;这是十分让人惊讶的。 为什么生成音乐如此困难? 创作音乐并不是一件容易的事。生成音频信号&…

“程序员交友网站” SO 突然裁员 10%,网友:ChatGPT 出来后就不咋用了

在ChatGPT影响下&#xff0c;知名开发者问答社区Stack Overflow撑不住要裁员了&#xff01; 随着用户大规模转战ChatGPT&#xff0c;Stack Overflow访问量大幅骤降&#xff0c;且盈利情况不容乐观。 CEO Prashanth Chandrasekar在公开信中坦言&#xff1a;正处于困难时期。 具…

巴比特 | 元宇宙每日必读:浙江发布2023年元宇宙产业发展工作要点,6月底前组建元宇宙产业联盟,年底打造20家“专精特新”企业...

摘要&#xff1a;据浙江省发改委官网 4 月 24 日消息&#xff0c;浙江省发改委等 5 部门近日联合印发《浙江省元宇宙产业发展 2023 年工作要点》。《工作要点》制定了十六项主要任务&#xff0c;并提出在2023 年 4 月底前建立元宇宙部门工作协同机制&#xff1b;6 月底前组建元…

免费版GPT-4!美国AI初创公司推出Forefront Chat,火到官网崩溃

免费版 GPT-4 到底香不香&#xff1f; AI初创企业正式推出Forefront Chat 近日&#xff0c;Forefront AI 正式推出 Forefront Chat&#xff0c;允许用户免费体验 GPT-4 的强大功能。ForeFront AI 是一家总部位于纽约的软件开发公司&#xff0c;联合创始人分别为 Jimmy Grease…

VTK笔记-生成MIP图像-vtkImageSlabReslice类

MIP MIP&#xff08;Maximum/Minimum Intensity Projection&#xff09;&#xff0c;最大/最小密度投影重建。   MIP可以较真实地反应组织密度差异&#xff0c;使得血管的异常改变、形态、走形强化&#xff1b;但是只适用于外观形态的显示。   在容积扫描数据中对每条径线上…

重温马云英文演讲:最伟大的成功

“机会在哪呢&#xff1f;”每当创业者发出这个疑问&#xff0c;我们就该重温马云的这段英文演讲&#xff0c;让奋斗的热血重新沸腾起来。你有什么。你有年轻的身体&#xff0c;你有奇妙的想法&#xff0c;你有乐观的心态&#xff0c;你有无限的可能性&#xff01; 演讲全文&am…

马云退隐前,在年会上说了最重要的三件事

作者&#xff1a;黄小斜 今天是9月10号教师节&#xff0c;也是马老师卸任阿里巴巴董事长的日子&#xff0c;同时也是阿里巴巴召开20周年年会的日子。有幸抽中了门票&#xff0c;在现场见证这具有历史意义的一幕&#xff0c;马老师在中场时给我们带来了一段演讲&#xff0c;也是…

阿里巴巴CTO独家自述:CTO就是要给CEO扫清障碍和风险

CTO可能不是思想家&#xff0c;但一定是行动派。 本文来自《云栖战略参考》第二期&#xff0c;过程中鲁肃非常坦率地探讨了一位合格CTO应该具备的素质&#xff0c;以及他自己一路摔打成长的心路历程。 一 我的经历 我的经历很简单&#xff0c;2004年之前一直在学校读书&#x…

马云现身西班牙度假 半年多来首次在境外露面

这半年里&#xff0c;马云公开露面的次数不到三次&#xff0c;就连前段时间的世界互联网大会也不见他的身影。 极少数出现在公众视野的马老师似乎在努力低调&#xff0c;但是他的一举一动仍然受人关注。 西班牙多家媒体10月19日报道&#xff0c;马云上周六飞抵西班牙, 在伊维…

【历史上的今天】8 月 22 日:改变世界的程序员们;网络直播的鼻祖;何小鹏离开阿里巴巴

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天 2022 年 8 月 22 日。历史上的今天&#xff0c;Masatoshi Shima 出生&#xff0c;他和 英特尔&#xff08;Intel&#xff09; 合作设计的芯片让第一个微处理器 Intel 400…