log4cpp初入门

news2025/1/11 0:26:15

目录

  • 下载与安装
  • log4cpp框架
    • Category
    • Appender
    • Layout
    • Priorty
    • Output
  • 功能
    • 日志级别
    • ⽇志格式化
    • ⽇志输出
    • 日志回滚
    • 日志配置文件

下载与安装

https://sourceforge.net/projects/log4cpp/
在这里插入图片描述

tar xvf log4cpp-1.1.3.tar.gz
cd log4cpp
./configure
make 
make check
make install
ldconfig

头文件位于/usr/local/include/log4cpp/
库文件位于/usr/local/lib/

log4cpp框架

在这里插入图片描述

Category

Appender

  1. ⽇志输出到控制台
OstreamAppender(const std::string& name, std::ostream* stream);
  1. ⽇志输出到本地⽂件
FileAppender(const std::string& name, const std::string& fileName,
                     bool append = true, mode_t mode = 00644);
  1. ⽇志通过⽹络输出到远程服务器
RemoteSyslogAppender(const std::string& name, 
                             const std::string& syslogName, 
                             const std::string& relayer, 
                             int facility = LOG_USER,
                             int portNumber = 514);
  1. 日志输出到系统日志
SyslogAppender(const std::string& name, const std::string& syslogName, 
                       int facility = LOG_USER);
  1. 日志输出到String队列
StringQueueAppender(const std::string& name);
  1. 日志输出到Buffer
BufferingAppender(const std::string name, unsigned long max_size, std::auto_ptr<Appender> sink,
                           std::auto_ptr<TriggeringEventEvaluator> evaluator);
  1. 日志在规定大小的文件中回滚输入
RollingFileAppender::RollingFileAppender(const std::string& name,
                                             const std::string& fileName, 
                                             size_t maxFileSize, 
                                             unsigned int maxBackupIndex,
                                             bool append,
                                             mode_t mode) :
  1. ……(可定制)

Layout

日志格式模板

  1. Basic layout
/**
     * BasicLayout is a simple fixed format Layout implementation. 
     **/
    class LOG4CPP_EXPORT BasicLayout : public Layout {
        public:
        BasicLayout();
        virtual ~BasicLayout();

        /**
         * Formats the LoggingEvent in BasicLayout style:<br>
         * "timeStamp priority category ndc: message"
         **/
        virtual std::string format(const LoggingEvent& event);
    };        
  1. simple layout
/**
     * BasicLayout is a simple fixed format Layout implementation. 
     **/
    class LOG4CPP_EXPORT SimpleLayout : public Layout {
        public:
        SimpleLayout();
        virtual ~SimpleLayout();

        /**
         * Formats the LoggingEvent in SimpleLayout style:<br>
         * "priority - message"
         **/
        virtual std::string format(const LoggingEvent& event);
    };        
  1. Pattern layout
/**
     * PatternLayout is a simple fixed format Layout implementation. 
     **/
    class LOG4CPP_EXPORT PatternLayout : public Layout {
        public:
        /**
           The default conversion pattern
        **/
        static const char* DEFAULT_CONVERSION_PATTERN;

        /**
           A conversion pattern equivalent to the SimpleLayout.
        **/
        static const char* SIMPLE_CONVERSION_PATTERN;

        /**
           A conversion pattern equivalent to the BasicLayout.
        **/
        static const char* BASIC_CONVERSION_PATTERN;

        /**
           A conversion pattern equivalent to the TTCCLayout.
           Note: TTCCLayout is in log4j but not log4cpp.
        **/           
        static const char* TTCC_CONVERSION_PATTERN;

        PatternLayout();
        virtual ~PatternLayout();
        
        // NOTE: All double percentage signs ('%%') followed by a character
        //       in the following comments should actually be a single char.
        //       The doubles are included so that doxygen will print them correctly.
        /**
         * Formats the LoggingEvent in the style set by
		 * the setConversionPattern call. By default, set
		 * to "%%m%%n"
         **/
        virtual std::string format(const LoggingEvent& event);

        /**
         * Sets the format of log lines handled by this
         * PatternLayout. By default, set to "%%m%%n".<br>
         * Format characters are as follows:<br>
         * <li><b>%%</b> - a single percent sign</li>
         * <li><b>%%c</b> - the category</li>
         * <li><b>%%d</b> - the date\n
         *  Date format: The date format character may be followed by a date format 
         *  specifier enclosed between braces. For example, %%d{%%H:%%M:%%S,%%l} or %%d{%%d %%m %%Y %%H:%%M:%%S,%%l}.
         *  If no date format specifier is given then the following format is used:
         *  "Wed Jan 02 02:03:55 1980". The date format specifier admits the same syntax 
         *  as the ANSI C function strftime, with 1 addition. The addition is the specifier
         *  %%l for milliseconds, padded with zeros to make 3 digits.</li>
         * <li><b>%%m</b> - the message</li>
         * <li><b>%%n</b> - the platform specific line separator</li>
         * <li><b>%%p</b> - the priority</li>
         * <li><b>%%r</b> - milliseconds since this layout was created.</li>
         * <li><b>%%R</b> - seconds since Jan 1, 1970</li>
         * <li><b>%%u</b> - clock ticks since process start</li>
         * <li><b>%%x</b> - the NDC</li>
         * @param conversionPattern the conversion pattern
         * @exception ConfigureFailure if the pattern is invalid
         **/
        virtual void setConversionPattern(const std::string& conversionPattern);

        virtual std::string getConversionPattern() const;

        virtual void clearConversionPattern();

        class LOG4CPP_EXPORT PatternComponent {
            public:
            inline virtual ~PatternComponent() {};
            virtual void append(std::ostringstream& out, const LoggingEvent& event) = 0;
        };

        private:
        typedef std::vector<PatternComponent*> ComponentVector; 
        ComponentVector _components;

        std::string _conversionPattern;
    };     
  1. PassThroughLayout
class PassThroughLayout : public Layout
   {
      public:
         virtual std::string format(const LoggingEvent& event) { return event.message; }
   };

Priorty

Output

三种输出风格

warn_log.log(log4cpp::Priority::WARN, "This will be a logged warning, darren = %d", 100);
warn_log.warnStream() << "This will be a logged warning, darren = " << 100;
warn_log.alert("Alert info");

功能

日志级别

日志等级值越小,打印等级越高

typedef enum {
	EMERG = 0,
	FATAL = 0,
	ALERT = 100,
	CRIT = 200,
	ERROR = 300,
	WARN = 400,
	NOTICE = 500,
	INFO = 600,
	DEBUG = 700,
	NOTSET = 800
} PriorityLevel;

⽇志格式化

/*********************************************************************
格式化布局。它的使⽤⽅式类似C语⾔中的printf,使⽤格式化它符串来描述输出格式。⽬前⽀持的转义
定义如下:
%% - 转义字符'%'
%c - Category
%d - ⽇期;⽇期可以进⼀步设置格式,⽤花括号包围,例如%d{%H:%M:%S,%l}。
⽇期的格式符号与ANSI C函数strftime中的⼀致。但增加了⼀个格式符号%l,表示毫秒,占三个
⼗进制位。
%m - 消息
%n - 换⾏符;会根据平台的不同⽽不同,但对⽤户透明。
%p - 优先级
%r - ⾃从layout被创建后的毫秒数
%R - 从1970年1⽉1⽇开始到⽬前为⽌的秒数
%u - 进程开始到⽬前为⽌的时钟周期数
%x - NDC
%t - 线程id
***********************************************************************/

⽇志输出

  1. ⽇志输出到控制台
  2. ⽇志输出到本地⽂件
  3. ⽇志通过⽹络输出到远程服务器
  4. ……(可定制)

日志回滚

  1. 本地⽇志⽀持最⼤⽂件限制
  2. 当本地⽇志到达最⼤⽂件限制的时候新建⼀个⽂件
  3. 每天⾄少⼀个⽂件

日志配置文件

该功能可以将日志打印建立层级关系,如下图,他们能够同步从上级将日志输出,不同的权限(root、sub1、sub2、sub1.sub1……)可以定制不同的输出方式,比如输出到服务器,比如输出到文件等,是否需要将日志向上级汇报,可以通过配置文件进行设置
在这里插入图片描述

  1. 加载日志配置文件
log4cpp::PropertyConfigurator::configure("log4cpp_lsy_test.conf");
  1. 获取输出层级
log4cpp::Category& root = log4cpp::Category::getRoot();
    log4cpp::Category& sub1 = 
        log4cpp::Category::getInstance(std::string("sub1"));
         log4cpp::Category& sub1 = 
        log4cpp::Category::getInstance(std::string("sub1"));
    log4cpp::Category& sub1_sub2 = 
        log4cpp::Category::getInstance(std::string("sub1.sub2"));
  1. 配置是否向上级汇报
# 默认是true,即默认向上级汇报
log4cpp.additivity.sub1=false
  1. 配置启用某个层级
    启用层级的时候,可以配置两个参数
    第一个参数:打印等级
    第二个参数:配置对应的adaptor
log4cpp.rootCategory=DEBUG, rootAppender
log4cpp.category.sub1=,A1
log4cpp.category.sub2=INFO
log4cpp.category.sub1.sub2=, A2
  1. 设置adaptor
# 配置为控制台输出
log4cpp.appender.rootAppender=org.apache.log4cpp.ConsoleAppender
log4cpp.appender.rootAppender.layout=org.apache.log4cpp.BasicLayout
# 配置为文件输出
log4cpp.appender.A1=org.apache.log4cpp.FileAppender
log4cpp.appender.A1.fileName=A1.log
log4cpp.appender.A1.layout=org.apache.log4cpp.SimpleLayout
# 配置为控制台输出
log4cpp.appender.A2=org.apache.log4cpp.ConsoleAppender
log4cpp.appender.A2.layout=org.apache.log4cpp.PatternLayout
# 配置输出模板
log4cpp.appender.A2.layout.ConversionPattern=%d %p %x - %m%n

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

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

相关文章

轻松玩转树莓派Pico之三、Windows+Ubuntu虚拟机模式下VSCode C语言开发环境搭建

目录 1、VSCode下载与安装 2、VSCode基础插件安装 3、SSH连接与配置 4、SSH免密登录 5、Pico编译 工欲善其事&#xff0c;必先利其器。之前的介绍的Pico流程都是通过命令行编译&#xff0c;没有进行更深入的介绍&#xff0c;本文将介绍Pico的VSCode-C语言开发环境搭建与配…

Rust WASM 与 JS 计算素数性能对比

前言 刚接触Rust wasm&#xff0c;请各看官高抬贵手。 简介 根据网上资料&#xff0c;使用 wasm-pack 搭配wasm-bindgen将Rust代码编译成 wasm。 搭好环境后&#xff0c;想对比一下rust-wasm与js的性能差距。 环境 OS: Deepin 20.7.1 apricotKernel: Linux 5.15.34CPU: Int…

LeetCode单周赛第320场 AcWing周赛第78场总结

1. LeetCode单周赛第320场 1.1 数组中不等三元组的数目 1.1.1 原题链接&#xff1a;力扣https://leetcode.cn/problems/number-of-unequal-triplets-in-array/ 1.1.2 解题思路&#xff1a; 暴力遍历咯。 1.1.3 代码&#xff1a; class Solution { public:int unequalTripl…

JAVA的学习心路历程之JDK基础入门(上)

任务需要&#xff0c;需要我学java调用linux下的动态库&#xff0c;于是搜寻java知识更新这篇。 从我上大学起我就听别人说JAVA&#xff0c;不不&#xff0c;应该是初中&#xff0c;那时候流行带键盘的智能手机&#xff0c;里面有好些个游戏都是JAVA写的&#xff0c;可见JAVA有…

【JavaWeb】HTML

HTML1 HTML概念1.1 超文本1.2 标记语言2 HTML的入门程序3 HTML语法规则4 使用idea创建StaticWeb工程5 HTML的各个标签的使用5.1标题标签5.2段落标签5.3换行标签5.4无序列表标签5.5超链接标签5.6图像标签5.7块标签6.使用表格标签展示数据6.1未合并单元格6.2合并单元格-合并列6.3…

套接字+网络套接字函数+客户端大小写程序

NAT映射 一般来说&#xff1a;源主机和目的主机都属于局域网&#xff0c;也就是ip地址可能相同 但是&#xff1a;路由器一般是公网ip,即整个网络环境可见 每一个路由器会维护一个NAT映射表 路由器的ip一般是固定的公网ip路由器与把与它相连的主机&#xff1a;私有ip端口号映射…

Java-多线程-ThreadPoolExecutor

前言 前面我们讲解线程的时候&#xff0c;讲到了使用Executors创建线程池&#xff0c;但是它里面所有方法可变的参数太少&#xff0c;不能很好的进行自定义设置&#xff0c;以及以后的扩展&#xff0c;更合理的使用cpu线程的操作&#xff0c;所以使用ThreadPoolExecutor创建线程…

SpringBoot集成webservice

前言 之前在工作中&#xff0c;有时候需要去对接第三方的医院&#xff0c;而很多医院的his系统用的都是老技术&#xff08;WebService&#xff09;。一直在对接webservice接口&#xff0c;却不知道webservice接口是怎么实现的&#xff0c;这一次&#xff0c;我们来一探究竟。 …

Android Compose Bloom 项目实战 (一) : 项目说明与配置

1. 项目介绍 Bloom是谷歌 AndroidDevChallenge (Android 开发挑战赛) 中的一期活动&#xff0c;目的是为了推广Compose&#xff0c;非常适合用来练手&#xff0c;通过这个项目&#xff0c;我们可以很好的入门Compose。本文介绍了如何从零开始&#xff0c;开发这个Compose项目。…

计算机系统结构期末复习

名词解释 程序访问局部性 时间局部性是指最近被访问过的数据很可能再次被访问 空间局部性是指最近被访问过的存储空间的附近空间可能会被访问 计算机体系结构 计算机体系结构是程序员所看到的计算机属性&#xff0c;即概念性结构与功能特性 窗口重叠技术 为了能更简单、更直接…

UE5笔记【五】操作细节——光源、光线参数配置、光照图修复

设置光线重载质量模式为预览&#xff1a;可以加快重构速度。 为了更快速高效的学习&#xff0c;直接查看别人已经建好的素材实例。 在EpicGames启动器中打开示例&#xff0c;找到这个照片级渲染。查看别人建好的效果图。 创建工程以UE5版本打开。进入查看。 观察Baked和碰撞测…

MySQL常用函数大全(面试篇)

本篇文章讲解是是MySQL的函数方法&#xff0c;涵盖所有的MySQL常见的方法。主要介绍了面试常问函数。 一、数字函数二、字符串函数三、日期函数四、MySQL高级函数 &#xff08;一&#xff09;数字函数 1、ABS(x) 返回x的绝对值 2、AVG(expression) 返回一个表达式的平均值&am…

Redis分布式锁

1. 什么是分布式锁 分布式锁指的是&#xff0c;所有服务中的所有线程都去获得同一把锁&#xff0c;但只有一个线程可以成功的获得锁&#xff0c;其他没有获得锁的线程必须全部等待&#xff0c;等到获得锁的线程释放掉锁之后获得了锁才能进行操作。 Redis官网中&#xff0c;set…

中加石墨再冲刺港交所上市:2022年初至今收入为零,陈东尧为CEO

11月18日&#xff0c;中加石墨控股股份有限公司&#xff08;下称“中加石墨”&#xff09;在港交所递交招股书&#xff0c;准备在港交所主板&#xff0c;宏信为独家保荐人。据贝多财经了解&#xff0c;这是中加石墨第二次递表&#xff0c;此前曾于2022年2月28日递交上市申请材料…

通过inode结构体取到次设备号,实现LED灯的亮灭

对Linux来说&#xff0c;设备驱动也是文件。驱动控制硬件的过程&#xff0c;实际上是对驱动文件的读写操作。 对内核来说&#xff0c;如何获取唯一的文件标识呢&#xff1f;当然是通过file结构体中的&#xff0c;inode结构体识别应用层打开的到底是哪一个设备文件。 实验操作及…

数据结构题目收录(二十)

1、含有n个非叶结点的m阶B树中至少包含&#xff08;&#xff09;个关键字。 A&#xff1a;n(m1)B&#xff1a;nC&#xff1a;n(┌\ulcorner┌m/2┐\urcorner┐-1)D&#xff1a;(n-1)(┌\ulcorner┌m/2┐\urcorner┐-1)1 解析 除根结点外&#xff0c;m阶B树中的每个非叶结点至…

mongodump工具安装及使用详解

MongoDB导入导出和备份的命令工具从4.4版本开始不再自动跟随数据库一起安装&#xff0c;而是需要自己手动安装。 官方网站下载链接&#xff1a;Download MongoDB Command Line Database Tools | MongoDB 将下载的压缩包通过工具上传到服务器或者虚拟机中某个路径下并解压&…

ZYNQ图像处理项目——线性神经网络识别mnist

一、线性神经网络识别mnist 线性神经网络其实也可以叫做线性分类器&#xff0c;其实就是没有激活函数的神经网络来对目标进行识别&#xff0c;像支持向量机、多元回归等都是线性的。这边我采用了线性神经网络来识别mnist数字。 我这边是看了一本讲神经网络的书籍&#xff0c;然…

分析高数值孔径物镜的聚焦特性

摘要 高数值孔径的物镜广泛用于光刻、显微等方面。 因此&#xff0c;在仿真聚焦时考虑光的矢量性质是至关重要的。VirtualLab可以支持此类透镜的光线和场追迹分析。通过场追迹分析&#xff0c;可以清楚地显示出由于矢量效应引起的非对称焦点。相机探测器和电磁场探测器可以方便…

【MySQL】Spring Boot项目基于Sharding-JDBC和MySQL主从复制实现读写分离(8千字详细教程)

目录前言一、 介绍二、 主从复制1. 原理2. 克隆从机3. 克隆从机大坑4. 远程登陆5. 主机配置6. 从机配置7. 主机&#xff1a;建立账户并授权8. 从机&#xff1a;配置需要复制的主机9. 测试10. 停止主从同步三、 读写分离1. Sharding-JDBC介绍2. 一主一从3. 一主一从读写分离3.1 …