Linux中的日志系统简介

在的Linux系统上使用的日志系统一般为rsyslogdrsyslogd守护进程既能接收用户进程输出的日志,又能接收内核日志。用户进程是通过调用syslog函数生成系统日志的。该函数将日志输出到一个UNIX本地域socket类型(AF_UNIX)的文件/dev/log中,rsyslogd则监听该文件以获取用户进程的输出。

一、日志的输出

1.1、打开日志

#include <syslog.h>

void openlog(const char* ident, int logopt, int facility);
  • ident参数指定的字符串将被添加到每条日志消息的开头,以便于识别消息的来源,通常是程序名称

  • logopt参数对后续syslog调用的行为进行配置,它可取下列值的按位或:

    •   #define LOG_PID 0x01/*在日志消息中包含程序PID*/
        #define LOG_CONS 0x02/*如果消息不能记录到日志文件,则打印至终端*/
        #define LOG_ODELAY 0x04/*延迟打开日志功能直到第一次调用syslog*/
        #define LOG_NDELAY 0x08/*不延迟打开日志功能*/
      
  • facility 参数可用来修改syslog函数中的默认设施值

    • LOG_USER:用户级别的消息。

    • LOG_MAIL:邮件系统。

    • LOG_DAEMON:系统守护进程。

    • LOG_AUTH:安全/授权消息。

    • LOG_SYSLOG:由syslogd(8)内部生成的消息。

1.2、打印日志

#include <syslog.h>

void syslog(int priority, const char* message, ...);
  • priority参数是设施值与日志级别的按位或

    • 设施值的默认值是LOG_USER,基本也只用到这一种

    • 日志级别有如下几个:

    •   #include <syslog.h>
        
        #define LOG_EMERG 0/*系统不可用*/
        #define LOG_ALERT 1/*报警,需要立即采取动作*/
        #define LOG_CRIT 2/*非常严重的情况*/
        #define LOG_ERR 3/*错误*/
        #define LOG_WARNING 4/*警告*/
        #define LOG_NOTICE 5/*通知*/
        #define LOG_INFO 6/*信息*/
        #define LOG_DEBUG 7/*调试*/
      
  • format:一个格式字符串,类似于 printf 函数中的格式字符串。它指定了如何格式化后续参数

1.3、关闭日志

#include <syslog.h>

void closelog();

1.4、设置日志掩码

程序在开发阶段可能需要输出很多调试信息,而发布之后我们又需要将这些调试信息关闭。解决这个问题的方法并不是在程序发布之后删除调试代码(因为日后可能还需要用到),而是简单地设置日志掩码,使日志级别大于日志掩码的日志信息被系统忽略。下面这个函数用于设置syslog的日志掩码:

#include <syslog.h>

int setlogmask(int maskpri);

maskpri参数指定日志掩码值。该函数始终会成功,它返回调用进程先前的日志掩码值。

二、日志的保存

rsyslogd守护进程在接收到用户进程或内核输入的日志后,会把它们输出至某些特定的日志文件。常见日志文件

/var/log/debug:调试信息
/var/log/btmp:记录登录失败的用户信息、时间及远程 ip
/var/log/cron:记录 crontab 执行情况
/var/log/kern.log:内核消息
/var/log/dmesg :开机自检信息
/var/log/lastlog:记录最后一次登录的时间、IP 等信息
/var/log/maillog:记录邮件收发详细信息
/var/log/wtmp:永久记录所有用户的登陆、注销信息,同时记录系统的后动、重启、关机事件
/var/log/messages:记录内核消息及各种应用程序的日志信
/var/log/secure:系统安全日志,记录用户登录认证情况,如 pop3、ssh、telnet、ftp 等记录
/var/run/utmp:记录当前登录的用户信息

三、日志的配置

内核日志由printk函数打印至内核的环状缓存中。缓存直接映射到/proc/kmsg文件中。rsyslogd则通过读取该文件获得内核日志。

用户日志则是调用 syslog 函数,向文件 /dev/log中写入信息,rsyslogd则通过读取该文件获得用户日志。

NeatReader-1713100850831

日志信息具体如何分发,可以在rsyslogd的配置文件中设置。rsyslogd的主配置文件是/etc/rsyslog.conf

主要可以设置的项包括:内核日志输入路径,是否接收UDP日志及其监听端口(默认是514,见/etc/services文件),是否接收TCP日志及其监听端口,日志文件的权限,包含哪些子配置文件(比如/etc/rsyslog.d/*.conf)。rsyslogd的子配置文件则指定各类日志的目标存储文件。

3.1、修改日志默认输出文件

/etc/rsyslog.conf文件末尾添加:

if $programname == 'httpp' then /var/log/httpp
& stop
  • if $programname == 'httpp' then /var/log/httpp:如果日志消息的程序名($programname)是'httpp',那么将该消息写入/var/log/httpp文件。
  • & stop:执行完上述写入操作后,停止对这条消息的进一步处理。

修改完配置后需要重启服务

sudo systemctl restart rsyslog

四、仿真

通过配置文件将httpp程序的日志输出到 /var/log/httpp 文件中。

现在输出日志信息

#include <unistd.h>  
#include <syslog.h>  
  
int main() {  
    // 打开日志  
    openlog("httpp", LOG_PID | LOG_CONS, LOG_USER);  
      
    // 记录日志消息  
    syslog(LOG_INFO, "LOG_INFO: Program started by user %d", getuid());  
    syslog(LOG_NOTICE, "LOG_NOTICE: Program started by user %d", getuid());  
    syslog(LOG_WARNING, "LOG_WARNING: Program started by user %d", getuid());  
    syslog(LOG_ERR, "LOG_ERR: Program started by user %d", getuid());  
    syslog(LOG_CRIT, "LOG_CRIT: Program started by user %d", getuid());  
    syslog(LOG_ALERT, "LOG_ALERT: Program started by user %d", getuid());  
    syslog(LOG_EMERG, "LOG_EMERG: Program started by user %d", getuid());  
      
    // 关闭日志  
    closelog();  
      
    return 0;  
}

仿真结果如下所示:

image-20240427210153912

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动联再掀创新风潮!P92 Max智能POS机惊艳发布

当下&#xff0c;智能支付与零售行业正经历着深刻变革&#xff0c;移动支付、无人支付等新型支付方式在我国广泛应用&#xff0c;显著优化了消费者的支付体验&#xff0c;同时也为零售行业带来新的发展契机。动联&#xff0c;凭借其在身份认证领域的深厚技术底蕴与创新精神&…

CRM客户关系管理系统源码部署/售后更新/搭建上线维护

基于ThinkPHPFastAdmin开发的CRM客户关系管理系统&#xff0c;专门为企业销售团队量身定制的工具&#xff0c;它能够有效地管理跟进客户&#xff0c;提高销售业绩&#xff01;提供无加密源代码&#xff0c;可以自行根据不同企业的需求进行开发定制。Uniapp版本(高级授权)支持编…

微服务保护-学习笔记

微服务保护 1 Sentinel入门1.1 雪崩问题1.1.1 什么是雪崩问题1.1.2 如何解决雪崩设置超时时间仓壁模式熔断降级限流&#xff08;预防措施&#xff09; 1.2 服务保护技术对比1.3 Sentinel介绍与安装Sentinel 特征Sentinel 安装 1.4 Sentinel整合微服务 2 流量控制3 熔断隔离和降…

【通信协议解析】WiFi协议解析

WiFi协议解析 一、发展由来 Wi-Fi&#xff0c;又称“无线网络”&#xff0c;是Wi-Fi联盟的商标&#xff0c;一个基于IEEE 802.11标准的无线局域网技术。“Wi-Fi”常写作“WiFi”或“Wifi”&#xff0c;但是这些写法并没有被Wi-Fi联盟认可。Wi-Fi产品经由Wi-Fi联盟的一家独立授…

MT7516A-ASEMI变频器专用MT7516A

编辑&#xff1a;ll MT7516A-ASEMI变频器专用MT7516A 型号&#xff1a;MT7516A 品牌&#xff1a;ASEMI 封装&#xff1a;MT-5 最大重复峰值反向电压&#xff1a;1600V 最大正向平均整流电流(Vdss)&#xff1a;75A 功率(Pd)&#xff1a;大功率 芯片个数&#xff1a;5 引…

数据结构与算法学习笔记八-二叉树的顺序存储表示法和实现(C语言)

目录 前言 1.数组和结构体相关的一些知识 1.数组 2.结构体数组 2.二叉树的顺序存储表示法和实现 1.定义 2.初始化 3.先序遍历二叉树 4.中序遍历二叉树 5.后序遍历二叉树 6.完整代码 前言 二叉树的非递归的表示和实现。 1.数组和结构体相关的一些知识 1.数组 在C语…

百倍潜力股Aleo即将上线,布局正当时!牛市来时,你得有币!

前言 在加密货币市场&#xff0c;2024年被众多市场专家预测为迎来新一轮牛市的关键年份。这一预测背后&#xff0c;潜藏着多种可能推动牛市的因素。其中&#xff0c;下一次比特币&#xff08;BTC&#xff09;的减半事件&#xff0c;以及2024年 BTC 现货ETF的推出&#xff0c;都…

二叉树-堆

树 在数据库中&#xff0c;树是一种数据结构&#xff0c;用于组织和存储数据&#xff0c;使得可以高效地进行插入、删除和查找操作。它通常用于表示层次关系或者有序集合。 基本概念 节点&#xff1a;树结构中的每个元素都称为节点。 根节点&#xff1a;树的最顶端节点。 子…

智能奶柜:健康生活新风尚

智能奶柜&#xff1a;健康生活新风尚 在快节奏的都市生活中&#xff0c;健康与便利成为了现代人的双重追求。而在这两者交汇之处&#xff0c;智能奶柜应运而生&#xff0c;它不仅是科技与生活的完美融合&#xff0c;更是日常营养补给的智慧之选。 清晨的第一缕温暖 —— 新鲜…

《应用现代化技术能力成熟度评估模型》介绍

在中国软件行业协会、应用现代化产业联盟以及中国电子技术标准化研究院的指导下&#xff0c;产业多家企业共同支持和参与下&#xff0c;完成的《应用现代化技术能力成熟度评估模型》标准。该标准从应用敏捷、稳定可靠、安全可信、业务智能、成本优化五大维度及22个能力项来评估…

【Linux系统编程】第十四弹---进度条

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、回车和换行 2、观察回车换行现象 3、缓冲区 4、usleep和fflush函数 5、简单倒计时 6、进度条 6.1、版本一 6.2、版本…

基于Python的数据分组技术:将数据按照1, 2, 3规则分为三个列表

目录 一、引言 二、数据分组原理与意义 三、案例分析 四、代码实现与解释 五、对新手友好的解释 六、技术细节与扩展 七、实际应用场景 八、总结 一、引言 在数据处理和分析的广阔领域中&#xff0c;数据分组是一项基础且重要的任务。数据分组通常指的是将数据集中的元…

最新版在线客服系统源码

源码介绍 首发最新在线客服系统源码&#xff0c;优化更好并且重构源码布局UI 性能不吃cpu并发快,普通1H2G都能带动最新版只要是服务器都能带动 搭建即可使用,操作简单,易懂 修复了老版本bug 内附有搭建教程 gofly.v1kf.com 运行环境 Nginx 1.20 MySQL 5.7 演示截图

双筒水封式防暴器有诚信才会被信赖

选择一款满意的产品&#xff0c;始于需求&#xff0c;终于品质&#xff0c;有品质才会热爱&#xff0c;有诚信才会被信赖 一、用途介绍&#xff1a; STFB型双筒水封式防爆器属于双罐结构的水封式防爆器&#xff0c;安装在抽放瓦斯泵吸气侧和排气端的管路上靠防爆器底部的水封保…

使用Docker安装Nginx

一、Nginx介绍 Nginx 是一款高性能的开源 Web 服务器和反向代理服务器&#xff0c;具有高效能、高稳定性、低资源消耗等优点。可以处理大量并发请求&#xff0c;支持多种协议&#xff0c;还能实现负载均衡、缓存等功能&#xff0c;在互联网应用中被广泛使用。在Nginx中&#xf…

ros 学习记录(二)URDF小车运动控制

URDF小车运动控制 准备工作创建 robot_xacro.launch 接上文&#xff0c;想用键盘控制小车在Gazebo中移动。 准备工作 名称版本ROSNoeticGazebo11.11.0 创建 robot_xacro.launch 通过运行这个launch文件&#xff0c;可以启动Gazebo仿真环境&#xff0c;并在仿真环境中加载和…

Redis实现延迟队列(为订单超时关闭提供更多的解决方案)

电商场景中的问题向来很受面试官的青睐&#xff0c;因为业务场景大家都相对更熟悉&#xff0c;相关的问题也很有深度&#xff0c;也有代表性&#xff0c;能更方便地考察候选人的技术水平。 比如商品购买下单支付的流程&#xff0c;在买家购买商品后会先生成订单&#xff0c;之后…

Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案

文章目录 一、vue中使用el-table的typeindex有时不显示序号Table 表格显示索引自定义索引报错信息解决方案 二、vue中Missing required prop: “value” 报错报错原因解决方案 三、el-table的索引值index在翻页的时候可以连续显示方法一方法二 四、vue3中Element Plus全局组件配…

微信小程序流量主如何自定义广告组件后台控制广告显示方式附源码[收藏]

最近开发了一个微信小程序&#xff0c;开通了流量主&#xff0c;引用广告显示。本教程干货满满&#xff0c;附上代码&#xff0c;建议**【收藏点赞】** 微信小程序广告有以下几种&#xff1a;Banner广告、激励广告、插屏广告、视频广告、视频贴片广告、封面广告。 为了增加广告…

数字工厂管理系统如何助力企业数据采集与分析

随着科技的不断进步&#xff0c;数字化已成为企业发展的重要趋势。在制造业领域&#xff0c;数字工厂管理系统的应用日益广泛&#xff0c;它不仅提升了生产效率&#xff0c;更在数据采集与分析方面发挥着举足轻重的作用。本文旨在探讨数字工厂管理系统如何助力企业数据采集与分…