最近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. angular 组件学习-组件内属性绑定

    #组件内的属性(元素的属性)绑定(property binding) 应用场景:通过改变DOM元素的属性,动态显示/隐藏一个元素 知识点:HTML 属性与DOM属性的区别 改变HTMl属性,浏览器需要 ...

  2. week8

    ---恢复内容开始--- week8 1.动态导入模块 2.断言 3.ftp 4.socketserver 1.动态导入模块 import importlib a = importlib.import ...

  3. matlab 将数字矩阵转换成图像

    MATLAB中,常常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算.在matlab中,为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型.如果直接 ...

  4. 大数据面试题——如何找出访问最多的IP

    问题描述: 现有海量日志数据保存在一个超大的文件中,该文件无法直接存入内存,要求从 中提取某天访问BD次数最多的IP 分析解读: 由于这个题目只关心某一天访问次数最多的IP,因此可以首先对文件进行一次 ...

  5. 使用HM16.0对视频编码

    1.编译HM16.0源码: 步骤参照:https://www.vcodex.com/hevc-and-vp9-codecs-try-them-yourself/(可设置pq等参数) [编译过程中遇到l ...

  6. 高通sdm845_la2.0源码编译及使用QFIL刷机

    一.下载源码 高通芯片代码下载地址:https://chipcode.qti.qualcomm.com/ . *_amss_standard_oem : 高通私有源码(*为sdm845-la--. * ...

  7. MySQL【日期和时间处理函数】的使用方法

    名称 调用示例 示例结果 描述 NOW NOW() 2018-09-19 09:24:10 返回当前日期和时间 CURDATE CURDATE() 2018-09-19 返回当前日期 CURTIME ...

  8. mybatis中<foreach>标签的使用

    标签太多,记一下不是特别常用的标签~留着脑袋瓜不机灵的时候看! <foreach>标签  该标签的作用是遍历集合类型的条件 <select id="countByUserL ...

  9. DevExpress v18.2新版亮点——DevExtreme篇(四)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExtreme Complete Sub ...

  10. json格式字符串用Uncaught SyntaxError: Unexpected token ' Uncaught SyntaxError: Unexpected number

    Unexpected number(index)的错误用的json字符串如 var jsonStr = "{1:'北京note备注信息',2:'上海note备注信息',3:'广东note备注 ...