嵌入式开发之syslog和rsyslog构建日志记录

1.syslogd作客户端

BusyBox v1.20.2 (2022-04-06 16:19:14 CST) multi-call binary.

Usage: syslogd [OPTIONS]

System logging utility

        -n              Run in foreground
        -O FILE         Log to FILE (default:/var/log/messages)
        -l N            Log only messages more urgent than prio N (1-8)
        -S              Smaller output
        -s SIZE         Max size (KB) before rotation (default:200KB, 0=off)
        -b N            N rotated logs to keep (default:1, max=99, 0=purge)
        -R HOST[:PORT]  Log to IP or hostname on PORT (default PORT=514/UDP)
        -L              Log locally and via network (default is network only if -R)
        -D              Drop duplicates
        -C[size_kb]     Log to shared mem buffer (use logread to read it)
        -f FILE         Use FILE as config (default:/etc/syslog.conf)

大概翻译下:

BusyBox v1.20.2 (2022-04-06 16:19:14 CST) multi-call binary.

Usage: syslogd [OPTIONS]

System logging utility

	-n              运行在前台。
    -O FILE         log输出到指定文件中 (默认:/var/log/messages)。
    -l N            设置记录的优先级,如果设置-l 7,是不会记录等级7,即LOG_DEBUG的,只会记录LOG_INFO及更高优先级。
    -S              是否显示hostname,以及user.info之类的详细信息。
    -s SIZE         在log达到SIZE后,循环log到messgas.0中,后续依次变动。
    -b N            保持的messages个数,messages最新,带的数字越大越老。依次覆盖。
    -R HOST[:PORT]  log输出到指定远程服务器。(默认 PORT=514/UDP)
    -L              log本地保存和网络传输 (如果设置-R的话,默认是网络传输)
    -D              Drop duplicates
    -C[size_kb]     log输出到共享内存,通过logread读取。
    -f FILE         指定conf文件。(default:/etc/syslog.conf)

从帮助信息,我们首先可以看到busybox,也就是我所查看的设备的syslogd并不是单独的应用,是busybox里面配置的,另外,关于配置文件,有时候在/etc下看不到配置文件,手动创建也不管用,这是因为busybox配置的时候,没有勾选syslogd配置文件选项,如下:
嵌入式开发之syslog和rsyslog构建日志记录_第1张图片
不支持配置文件也没事,可以在运行的时候指定参数,下面是一个脚本,S01logging:

#!/bin/sh
#
# Start logging
#

SYSLOGD_ARGS="-n -s 10240 -O /userdata/messages -b 10 -R 192.168.0.161 -L"
KLOGD_ARGS=-n
[ -r /etc/default/logging ] && . /etc/default/logging

start() {
        printf "Starting logging: "
        start-stop-daemon -b -S -q -m -p /var/run/syslogd.pid --exec /sbin/syslogd -- $SYSLOGD_ARGS
        start-stop-daemon -b -S -q -m -p /var/run/klogd.pid --exec /sbin/klogd -- $KLOGD_ARGS
        echo "OK"
}

stop() {
        printf "Stopping logging: "
        start-stop-daemon -K -q -p /var/run/syslogd.pid
        start-stop-daemon -K -q -p /var/run/klogd.pid
        echo "OK"
}

case "$1" in
  start)
        cat /etc/os-release
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        stop
        start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $?

注意:上面的 -R 192.168.0.161,没有设置端口,默认是udp 514端口,将log信息上传到这个ip的服务器,所以这个ip的设备也需要配置一个服务端,然后就可以接收设备的log信息了。

2.rsyslog作服务端

现在默认的linux pc系统都已经安装了rsyslog的,我用的是Ubuntu18.04默认就安装了这个服务,只是没启动而已,修改配置,来作为log的服务端,打开修改配置文件:

sudo vim /etc/rsyslog.conf

将下面屏蔽的地方打开:

#################
#### MODULES ####
#################

module(load="imuxsock") # provides support for local system logging
#module(load="immark")  # provides --MARK-- message capability

# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")

修改为:

#################
#### MODULES ####
#################

module(load="imuxsock") # provides support for local system logging
#module(load="immark")  # provides --MARK-- message capability

# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")

这样修改之后,启动服务,因为默认是没有启动的,启动命令:

sudo service rsyslog start

查看是否监听udp 514端口:

zl@zl-Lenovo:~$ sudo netstat -aulntp | grep rsyslog
[sudo] password for zl:
udp        0      0 0.0.0.0:514         0.0.0.0:*                      936/rsyslogd
udp6       0      0 :::514              :::*                           936/rsyslogd

客户端上传的日志会自动保存到/var/log/syslog文件里面,而且是无法区分设备的,比如一个ip是192.168.0.34的设备,还有一个是192.168.0.165的设备,他们的日志会混到一个文件,如果要分开,甚至要按照应用来区分,也是可以的,需要设置一个模板,再次打开配置文件,在 GLOBAL DIRECTIVES 下添加如下内容:

###########################
#### GLOBAL DIRECTIVES ####
###########################

#$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" *
$template RemoteLogs,"/var/log/%HOSTNAME%/messages.log" *
*.* ?RemoteLogs
& ~

" $template RemoteLogs," /var/log/%HOSTNAME%/messages.log" *"保存的文件如下:

root@zl-Lenovo:/var/log# tree .
.
├── 192.168.0.165
│   └── messages.log
├── 192.168.0.34
│   └── messages.log

" $template RemoteLogs," /var/log/%HOSTNAME%/%PROGRAMNAME%.log" *"保存的文件如下:

root@zl-Lenovo:/var/log# tree .
.
├── 192.168.0.165
│   ├── mediaserver.log
│   └── nvrserver.log
├── 192.168.0.34
│   └── nvrserver.log

可以根据需求来设置服务端,保存不同形式的log文件。

注意:

root@zl-Lenovo:/var/log# tree .
.
├── 192.168.0.165
│   ├── mediaserver.log
│   └── nvrserver.log
├── 192.168.0.34
│   └── nvrserver.log

可以根据需求来设置服务端,保存不同形式的log文件。

注意:

如果删掉了/var/log目录下保存的日志文件,必须重启下rsyslog服务,否则不会再保存文件。

你可能感兴趣的:(嵌入式软件,linux)