syslog日志打印

最近syslog出了一次问题,我们配置了不同appname打印到不同文件。现在用不同appname打印log的时候,偶然会混在一起。检查过配置后,觉得不是配置问题,如果是配置问题应该每一条都会打错位置。后来同事发现是c接口线程不安全导致的。这里不是指syslog的libc接口线程不安全,是我们调用syslog的lua接口封装有问题。

syslog是一个历史悠久的日志记录标准。一般的日志记录流程是这样的:内核会在内核空间,创建好一个ring buffer,然后调用printk函数在这个buffer里进行打印。用户空间的程序要访问这个buffer,可以通过两种方式读到,一个是/proc/kmsg,另一个是sys_syslog系统调用。

内核ring buffer主要由两个程序读取:dmesg(1)和klogd(8),前者是供用户按需调用,查看内核信息,后者是从/proc/kmsg中自动读取(或者在/proc还没挂载的时候,调用sys_syslog接口读取),并转发到syslogd或者命令行,这是与内核相关的流程。

用户空间的流程主要是由syslogd(8)来处理,它会监听一些unix domain socket,比如 /dev/log(具体路径可配置),或者UDP的514端口。同时也会从klogd(8)读取日志。然后,syslogd会把这些信息打印到/log,或者通过自己的UDP协议发送到远端。具体配置在/etc/syslog.conf

用户空间的程序会调用libc函数syslog(3)来进行打印。libc会将日志打到unix domain socket: /dev/log,并由syslogd(8)来读取。

syslog(3)的接口主要用到的有openlog, syslog, closelog三个,分别是打开,关闭,和打印日志。openlog()先连接到系统logger,然后syslog接口打印日志。多线程的时候,openlog之后,还没有调syslog接口写日志,就切换到其他线程了。其他线程也调用了openlog和syslog来打印日志。切回来到原来的线程,再syslog的时候就会打印到错误的地方了。感觉openlog的接口设计也有点问题,一般是open完返回一个东西作为凭证。

解决方法有三种,一种是skynet内新建一个服务,所有日志都打到这个服务,这个服务再打印日志,相当于利用skynet的消息队列做锁保护。另一种是调整syslog参数的priority,保证不同appname对应不同priority。最后一种是直接对这个函数加锁,保证线程安全。

又及:libc的syslog接口,唯一做的就是新建,连接,写入,关闭udp socket,和自己直接做没有任何区别。对于过载,因为内核用的是ringbuffer,估计就直接覆盖前面的了。

时间: 2024-10-20 16:13:49

syslog日志打印的相关文章

十、syslog日志与loganalyzer日志管理

10.1.rsyslog简介 syslog是一个历史悠久的日志系统.几乎所有的UNIX和Linux操作系统都采用syslog进行系统日志的管理和配置.Linux系统内核和许多程序会产生各种错误信息.警告信息和其他的提示信息.syslog可以根据信息的来源以及信息的重要程度将信息保存到不同的日志文件中.在默认的syslog配置下,日志文件通常都保存在/var/log目录下,在Centos6中,syslog的守护进程为rsyslog,系统启动时,默认会自动运行rsyslog守护进程. 在syslog

Linux syslog日志系统详解

一. syslog简介 syslog是一种工业标准的协议,可用来记录设备的日志.在UNIX系统,路由器.交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件.管理者可以通过查看系统记录,随时掌握系统状况.UNIX的系统日志是通过syslogd这个进程记录系统有关事件记录,也可以记录应用程序运作事件.通过适当的配置,我们还可以实现运行syslog协议的机器间通信,通过分析这些网络行为日志,藉以追踪掌握与设备和网络有关的状况. 功能:记录至系统记录. 二 . sysl

syslog日志格式解析

在网上搜的文章,写的很全乎.摘抄如下,供大家参考学习 1.介绍 在Unix类操作系统上,syslog广泛应用于系统日志.syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器.接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理.常见的应用场景是网络管理工具.安全管理系统.日志审计系统. 完整的syslog日志中包含产生日志的程序模块(Facility).严重性(Severity或 Level).时间.主机名或I

GNU Linux syslog守护进程简介及syslog日志写入例子

rsyslog进程 syslog是记录系统中的日志记录的一个工具,可以支持本地的.也可以支持远程的日志的写入. 在LinuxMint环境中,基于upstart的机制的后台守护程序是放在/etc/init/目录下的,可使用下如下的命令进行查看具体的启动脚本: [email protected]:/var/log$ less /etc/init/rsyslog.conf 查看当前rsyslogd是否已经启动: [email protected]:/var/log$ initctl list | gr

rsyslog日志打印到控制台的异常

场景描述:Linux系统启动之后,没有进入到登录界面之前,屏幕刷拉拉一大片的HTTP日志打印,吓了我一大跳,这又是什么系统异常吗?这些日志不是应该写入到/var/log/messages文件中吗?毕竟HTTP服务程序调用的是syslog函数接口!!另外一件古怪的事情是,关闭系统的时候,日志也打印到了控制台,这正是菲尼索斯的事情. 解开谜团:开机打印日志到控制台是因为rsyslog并没有启动,HTTP服务程序只能够把日志输出到控制台上,说明没有把服务的顺序调整好,所以我们应该在HTTP服务程序的依

syslog 日志

syslog日志是系统日志的一种,可以存放在本地也可以发送到syslog日志服务器, 但是syslog日志由于的格式不统一,在日常工作中审计syslog日志是一种很麻烦的 事情.不过在2001出现了一份关于syslog标准的协议(建议). 生成发送日志的叫做:Device 转发的叫做:Relay(可以作为Device或Coolector) 接收的叫做:Collector 传输标准使用UDP,消息大小小于1024个字节,端口使用514 PS:只是建议. syslog日志可以分为三部分: 4.1 s

Java项目中如何使用log4j和slf4j实现日志打印

什么是log4j? Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. 什么是slf4j? SLF4J,即简单日志门面(Simple Logging Facade fo

python日志打印和写入并发简易版本实现

大家一般都用logging日志打印,但logging是线程安全的,多进程也有很多介绍,引入一些文件锁,对logging做好配置,能过支持. 但通过测试,发现多进程时还是容易出现重复写入文件或者打印正常漏写入文件的问题. 我的日志需求比较简单,能够区分文件,正确的写入日志文件. 引入文件锁:日志写入函数封装到一个操作_Logger类中: 日志名称和写入级别封装到一个业务类Logger中. 本范例基于python3实现.本范例20个进程并发,分别写入3个文件,每s每个文件写入超过100行数据,日志文

项目log日志打印

①使用到的jar包: 大概是这几个,具体我也不知道是哪一个,下次使用的时候自己测试下. commons-logging-1.2.jar commons-discovery-0.5.jar log4j-1.2.17.jar ②log4j.properties log4j.rootLogger=DEBUG,CONSOLE,A log4j.addivity.org.apache=false log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender