Linux中的日志系统简介

news2024/11/28 6:29:58

在的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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++11 标准模板(STL)本地化库 - 平面类别(std::money_get) - 从输入字符序列中解析并构造货币值

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 从输入字符序列中解析并构造货币值 std::money_get template<…

威乐集团亚太PMO负责人和继明受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 威乐集团亚太PMO负责人和继明先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“PMO助力企业项目管理走向卓越”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; AI人工智能的…

移动UI瓷片区能有多漂亮?要多漂亮就多漂亮。

移动UI的瓷片区&#xff08;Tile area&#xff09;是指移动应用或移动网页的界面布局中的一个区域&#xff0c;通常用于展示独立的信息块或功能块&#xff0c;每个块都是一个可点击的图标或瓷片&#xff0c;用于快速访问相关功能或查看相关信息。 瓷片区的设计灵感来源于Window…

Vue.js-----vue组件

能够说出vue生命周期能够掌握axios的使用能够了解$refs, $nextTick作用能够完成购物车案例 Vue 生命周期讲解 1.钩子函数 目标&#xff1a;Vue 框架内置函数&#xff0c;随着组件的生命周期阶段&#xff0c;自动执行 作用: 特定的时间点&#xff0c;执行特定的操作场景: 组…

基于LangChain-Chatchat实现的本地知识库的问答应用-快速上手(检索增强生成(RAG)大模型)

基于LangChain-Chatchat实现的本地知识库的问答应用-kuaisu&#xff08;检索增强生成(RAG)大模型&#xff09; 基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现&#xff0c;开源、可离线部署的检索增强生成(RAG)大模型知识库项目。 1.介绍 一种利用 langchain思想实现…

jupyter notebook单元格运行耗时计算魔术方法timeit

%%timeit 默认执行多次计算平均耗时 -n 或 --number&#xff1a;指定总的运行次数。 -r 或 --repeat&#xff1a;指定每个运行要重复的次数。 例如&#xff0c;如果你想要运行一个测试&#xff0c;总共运行3次&#xff0c;每次运行7次迭代&#xff0c;你可以这样写&#xff1a…

MySQL——利用变量进行查询操作

新建链接&#xff0c;自带world数据库&#xff0c;里面自带city表格。 DQL # MySQL利用变量进行查询操作 set cityNameHaarlemmermeer; select * from city where NamecityName;# 多个结果查询 set cityName1Haarlemmermeer; set cityName2Breda; set cityName3Willemstad; s…

气膜种植仓:解决空间需求,助力农业发展

在现代农业发展的背景下&#xff0c;气膜种植仓成为了解决空间需求和提升种植效率的理想选择。气膜种植仓结合了先进的建筑技术和现代农业理念&#xff0c;为种植业带来了全新的解决方案&#xff0c;具有以下几大优势&#xff1a; 1. 最大化空间利用 气膜种植仓采用无梁无柱的设…

Kinetic Technologies授权世强硬创代理,DC-DC转换器尺寸小、发热量低

为能够更好的服务国内消费电子、通信、工业、汽车和企业系统客户&#xff0c;持续满足他们对高效、智能集成电路产品的需求&#xff0c;世强先进&#xff08;深圳&#xff09;科技股份有限公司&#xff08;下称&#xff1a;“世强先进”&#xff09;与Kinetic Technologies Sem…

【环境配置】vsCode 中使用 conda 配置虚拟环境

文章目录 准备前言在 vsCode 中直接创建创建步骤测试更新环境 使用 Anaconda 建立虚拟环境创建步骤在 vsCode 中选择环境 总结 准备 在看本博客之前&#xff0c;希望大家有以下知识储备&#xff1a; 能够正确安装 vsCode&#xff0c;并配置好 python 环境&#xff1b;了解并安…

Visual Studio 中.net8.0(以前叫NET Core)框架和.net framewok 框架有什么区别?

更新vs到2022版本后&#xff0c;新建项目时就多出不少选项&#xff0c;这里来给大家分享下.net8.0&#xff08;以前叫NET Core&#xff09;框架和.net framewok的区别 如下图&#xff0c;不带后缀的就是使用.net8.0。 .net framewok框架选项&#xff1a; 正文开始&#xff1a;…

基于vs和C#的WPF应用之动画3

注&#xff1a;1、在内部和外部使用缓动函数 <Grid.Resources> <PowerEase x:Key"powerease" Power"3" EasingMode"EaseInOut"/> </Grid.Resources> <DoubleAnimation EasingFunction"{StaticResource powerease}&quo…

魔法程序员的奥妙指南:Java基本语法

作为一名魔法程序员&#xff0c;精通Java语言是至关重要的。Java作为一种强大的编程语言&#xff0c;在编写优质代码和开发强大应用程序时发挥着重要作用。让我们深入探讨Java基本语法的关键要点&#xff0c;从注释到变量&#xff0c;无所不包&#xff01; Java基本语法的神秘魔…

《十六》QT TCP协议工作原理和实战

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QTcpSocket组件实现基于TCP的网络通信…

状态分解定义互斥和并行模式练习

互斥 (OR) 状态分解 带有实线边框的子状态表示互斥 (OR) 状态分解。此分解可用于描述互斥工作模式。当状态拥有互斥 (OR) 分解时&#xff0c;一次只能有一个子状态激活。 并行 (AND) 状态分解 带有虚线边框的子状态表示并行 (AND) 状态分解。使用此分解可以描述并行工作模式…

程序员自由创业周记#33:创业者的一天

程序员自由创业周记#33&#xff1a;创业者的一天 一天的安排 只工作不上班的日子是非常考验一个人自律能力的&#xff0c;如果顶不住各种诱惑&#xff0c;一天的时间转瞬即逝。尤其对我这种兴趣极其广泛的人。如果不自律&#xff0c;上午一场NBA比赛就过去了&#xff1b;如果不…

西奥机电CLRT-01:重塑碳酸饮料质检新纪元

西奥机电CLRT-01&#xff1a;重塑碳酸饮料质检新纪元 在追求品质生活的今天&#xff0c;碳酸饮料的品质检测成为了行业内外关注的焦点。西奥机电&#xff0c;作为行业创新的领跑者&#xff0c;携其最新研发的CLRT-01二氧化碳气容量测试仪&#xff0c;为碳酸饮料行业带来了革命性…

Python 散点图分类别标签+不同颜色区分

文章目录 1. 前言2. 实现2.1 构建数据对2.2 构建colors_map2.3 绘制图 3. 完整示例 1. 前言 在散点图中&#xff0c;我们有时候希望把不同类别的点用不同颜色区分&#xff0c;并且不同类别有图例标签标明&#xff0c;实现类似如下的结果&#xff1a; 2. 实现 2.1 构建数据对…

可重入分布式锁有哪些应用场景

原文连接&#xff1a;可重入分布式锁有哪些应用场景 https://mp.weixin.qq.com/s/MTPS9V8jn5J91wr-UD4DyA 之前发过的一篇实现Redis分布式锁的8大坑中&#xff0c;有粉丝留言说&#xff0c;分布式锁的可重入特性在工作中有哪些应用场景&#xff0c;那么我们这篇文章就来看一下…