最近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,估计就直接覆盖前面的了。

syslog日志打印的更多相关文章

  1. python(36):python日志打印,保存,logging模块学习

    1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info messa ...

  2. syslog之一:Linux syslog日志系统详解

    目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...

  3. syslog日志格式解析

    在网上搜的文章,写的很全乎.摘抄如下,供大家参考学习 1.介绍 在Unix类操作系统上,syslog广泛应用于系统日志.syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog ...

  4. syslog日志

    Syslog协议 系统日志(Syslog)协议是在一个IP网络中转发系统日志信息的标准,它是在美国加州大学伯克利软件分布研究中心(BSD)的TCP/IP系统实施中开发的,目前已成为工业标准协议,可用它 ...

  5. syslog 日志

    syslog日志是系统日志的一种,可以存放在本地也可以发送到syslog日志服务器, 但是syslog日志由于的格式不统一,在日常工作中审计syslog日志是一种很麻烦的 事情.不过在2001出现了一 ...

  6. Android Studio中JNI程序的单步调试和日志打印

    近日有个算法(检测碰撞)需要用C++实现,目的是IOS和ANDROID中共享同一段程序. 下面说说android调用这段程序过程中遇到的一些事情.(过程中网上搜索了一些相关文章,大部分说的是eclip ...

  7. nginx反向代理nginx,RealServer日志打印真实ip

    title: nginx反向代理nginx,RealServer日志打印真实ip date: 2016-05-11 19:15:37 tags: --- nginx反向代理nginx,RealServ ...

  8. android的Log日志打印管理工具类(一)

    android的Log日志的打印管理工具类: package com.gzcivil.utils; import android.util.Log; /** * 日志打印管理 * * @author ...

  9. C++日志打印

    C++日志打印: %d              十进制有符号整数 %u              十进制无符号整数 %f              浮点数 %s              字符串 % ...

随机推荐

  1. Centos7中网络及设备相关配置

    centos7中,不再赞成使用ifconfig工具,取而代之的是nmcli工具,服务管理也是以systemctl工具取代了service,这些之前版本的工具虽然在centos7中还可以继续使用,只是出 ...

  2. SecureCRT常见配置

    不自动断开连接 颜色设置 然后再在/etc/bash.bashrc中加入这句话alias ls='ls --color',其实意思就是以后所有的ls命令,就是ls –color命令

  3. css--样式表的引入方法

    html引用css方法如下1.直接在div中使用css样式(内链)2.html中使用style自带式(嵌入)3.使用@import引用外部CSS文件(外部引入)4.使用 link引用外部CSS文件 推 ...

  4. Excel关联xml文件

    1.新建没传值的xml文件,变量名称自己定义好 2.打开excel,如果之前没有设置过,点击选项 如果当前Excel菜单栏中没有开发工具项,在自定义功能区先勾选上开发选项 3.点右下角的xml映射 弹 ...

  5. ACCESS 查询重复记录

    In (SELECT [全称] FROM [New14] As Tmp GROUP BY [全称],[账号],[银行] HAVING Count(*)>1  And [账号] = [New14] ...

  6. asp.net IHttpHandler浅析

    在asp.net程序中,我们可以通过配置url的path路径的方式,将某个path路径下的请求交给指定的IHttpHandler去处理,这便是对request请求进行编程. 一.新建一个framewo ...

  7. 等积投影(equal-area projection)

    等积投影(equal-area projection)是地图投影的一种,是地图上任何图形面积经主比例尺放大以后与实地上相应图形面积保持大小不变的一类投影.即投影面积与实地面积相等的投影——面积比为1. ...

  8. 从excel表中生成批量SQL,将数据录入到数据库中

    excel表格中有许多数据,需要将数据导入数据库中,又不能一个一个手工录入,可以生成SQL,来批量操作.     1.首先在第二行的H列,插入函数:=CONCATENATE("INSERT ...

  9. 活代码LINQ——06

    一.模块代码 ' Fig. 9.4: LINQWithArrayOfObjects.vb ' LINQ to Objects using an array of Employee objects. M ...

  10. 使用idea启动springMVC+Hibernate其他项目

    打开项目后打开Project Structure 点开左边的Libraries 加入依赖包 点开左边的Moudules 选中项目 新建Web,Spring,Hibernate三项 Hibernate添 ...