Java用log4j写日志

日志可以方便追踪和调试问题,以前用log4net写日志,换Java了改用log4j写日志,用法和log4net差不多。

到apache包下载下载log4j的包,解压后把下图两个jar包引入工程
在这里插入图片描述

先到网站根下加一个log4j2.xml的配置文件来配置日志的格式和参数
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR">
  <!--Configuration 配置项
  status:log4j本身的日志级别, “trace”, “debug”, “info”, “warn”, “error” and “fatal”
  monitorInterval:每隔多少秒从新读取配置文件,可以在不重启的情况下修改配置-->
  <Appenders>
    <!--Appenders定义日志输出,有Console、File、RollingRandomAccessFile、MongoDB、Flume 等
    有Console:输出源到控制台
    File:将日志输出到文件,通过fileName指定存储到的文件(目录不存在会自动创建)
    RollingRandomAccessFile:也是写入文件,但可以定义规则按照文件大小或时间等重新创建一个新的日志文件存储;如果是按时间分割需要配合filePattern使用
    -->
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %F %logger{36} - %msg%n"/>
      <!--PatternLayout指定输出日志的格式 -->
    </Console>
    <File name="ExceptionRollingLogFileAppender" fileName="./Logs/异常日志.txt" append="true">
      <PatternLayout pattern="%date [%thread] %-5level %15logger %appdomain %location -- %message %exception %newline"/>
    </File>
    <File name="DebugRollingLogFileAppender" fileName="./Logs/调试日志.txt" append="true">
      <PatternLayout pattern="%date [%thread] %-5level %15logger %appdomain %location -- %message %exception %newline"/>
    </File>
    <File name="OperationRollingLogFileAppender" fileName="./Logs/方法日志.txt" append="true">
      <PatternLayout pattern="%date [%thread] %-5level %15logger %appdomain %location -- %message %exception %newline"/>
    </File>
    <File name="SqlRollingLogFileAppender" fileName="./Logs/Sql语句日志.txt" append="true">
      <PatternLayout pattern="%date [%thread] %-5level %15logger %appdomain %location -- %message %exception %newline"/>
    </File>
    <File name="CapabilityRollingLogFileAppender" fileName="./Logs/性能.txt" append="true">
      <PatternLayout pattern="%date [%thread] %-5level %15logger %appdomain %location -- %message %exception %newline"/>
    </File>
    <File name="SecurityRollingLogFileAppender" fileName="./Logs/安全.txt" append="true">
      <PatternLayout pattern="%date [%thread] %-5level %15logger %appdomain %location -- %message %exception %newline"/>
    </File>

    <RollingFile name="customscript" fileName="${LOG_HOME}${FILE_NAME}" filePattern="${LOG_HOME}${FILE_NAME}.%d{yyyy-MM-dd}.log">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %M %L - %msg%xEx%n"/>
      <Policies>
        <TimeBasedTriggeringPolicy />
      </Policies>
    </RollingFile>
  </Appenders>
  <Loggers>
    <!--日志器,通过LogManager.getLogger(日志器name)的日志器名字决定使用具体哪个日志器
    分为根Root日志器和自定义日志器-->
    <Root level="ERROR">
      <!--当根据名字找不到对应的日志器时,使用Root的日志器
      leve:日志输出等级(默认ERROR);TRACE > DEBUG > INFO > WARN > ERROR, ALL or OFF-->
      <AppenderRef ref="Console"/>
      <!--AppenderRef:关联Appenders中定义的输出规则,可以有多个,日志可以同时输出到多个地方-->
      <AppenderRef ref="debuglog"/>
    </Root>
    <Logger name="Exception" level="ALL" additivity="false">
      <!--Logger自定义日志器:
        name为日志器的名字,通过LogManager.getLogger(日志器name)获得该日志器连接
        additivity:相加性。默认为true,若为true会将当前日志内容也打印到它上面的日志器内,这里上面日志器是Root-->
      <AppenderRef ref="ExceptionRollingLogFileAppender"/>
    </Logger>

    <Logger name="Operation" level="ALL" additivity="false">
      <!--Logger自定义日志器:
        name为日志器的名字,通过LogManager.getLogger(日志器name)获得该日志器连接
        additivity:相加性。默认为true,若为true会将当前日志内容也打印到它上面的日志器内,这里上面日志器是Root-->
      <AppenderRef ref="OperationRollingLogFileAppender"/>
    </Logger>

    <Logger name="Debug" level="ALL" additivity="false">
      <!--Logger自定义日志器:
        name为日志器的名字,通过LogManager.getLogger(日志器name)获得该日志器连接
        additivity:相加性。默认为true,若为true会将当前日志内容也打印到它上面的日志器内,这里上面日志器是Root-->
      <AppenderRef ref="DebugRollingLogFileAppender"/>
    </Logger>

    <Logger name="SqlLog" level="ALL" additivity="false">
      <!--Logger自定义日志器:
        name为日志器的名字,通过LogManager.getLogger(日志器name)获得该日志器连接
        additivity:相加性。默认为true,若为true会将当前日志内容也打印到它上面的日志器内,这里上面日志器是Root-->
      <AppenderRef ref="SqlRollingLogFileAppender"/>
    </Logger>

    <Logger name="Capability" level="ALL" additivity="false">
      <!--Logger自定义日志器:
        name为日志器的名字,通过LogManager.getLogger(日志器name)获得该日志器连接
        additivity:相加性。默认为true,若为true会将当前日志内容也打印到它上面的日志器内,这里上面日志器是Root-->
      <AppenderRef ref="CapabilityRollingLogFileAppender"/>
    </Logger>

    <Logger name="Security" level="ALL" additivity="false">
      <!--Logger自定义日志器:
        name为日志器的名字,通过LogManager.getLogger(日志器name)获得该日志器连接
        additivity:相加性。默认为true,若为true会将当前日志内容也打印到它上面的日志器内,这里上面日志器是Root-->
      <AppenderRef ref="SecurityRollingLogFileAppender"/>
    </Logger>

  </Loggers>
</Configuration>

然后实现日志工具类

package LIS.Core.Util;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LogUtils {
    //得到日志操作,默认写在Tomcat的Bin下
    //异常日志
    static final Logger loggerException = LogManager.getLogger("Exception");

    //操作日志
    static final Logger loggerOperation = LogManager.getLogger("Operation");

    //调试日志
    static final Logger loggerDebug = LogManager.getLogger("Debug");

    //sql日志
    static final Logger loggerSqlLog = LogManager.getLogger("SqlLog");

    //性能日志
    static final Logger loggerCapability = LogManager.getLogger("Capability");

    //安全日志
    static final Logger loggerSecurity = LogManager.getLogger("Security");


    /// <summary>
    /// 书写调试日志
    /// </summary>
    /// <param name="message">日志内容</param>
    public static void WriteDebugLog(String message)
    {
        loggerDebug.debug(message);
    }

    /// <summary>
    /// 书写异常日志
    /// </summary>
    /// /// <param name="message">日志内容</param>
    /// <param name="exception">异常对象</param>
    public static void WriteExceptionLog(String message, Exception exception)
    {
        loggerException.error(message, exception);
    }

    /// <summary>
    /// 书写性能日志
    /// </summary>
    /// <param name="message">日志内容</param>
    public static void WriteCapabilityLog(String message)
    {
        loggerCapability.info(message);
    }

    /// <summary>
    /// 书写安全日志
    /// </summary>
    /// <param name="message">日志内容</param>
    public static void WriteSecurityLog(String message)
    {
        loggerSecurity.info(message);
    }

    /// <summary>
    /// 书写操作日志
    /// </summary>
    /// <param name="message">日志内容</param>
    public static void WriteOperationLog(String message)
    {
        loggerOperation.info(message);
    }


    /// <summary>
    /// 书写调试日志
    /// </summary>
    /// <param name="message">日志内容</param>
    public static void WriteSqlLog(String message)
    {
        loggerSqlLog.debug(message);
    }
}

调用写日志测试
在这里插入图片描述

在这里插入图片描述

在Tomcat的Bin下的Logs生成日志
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

后面就把System.out.println的打印日志换为LIS.Core.Util.LogUtils写日志了

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

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

相关文章

自动驾驶行业观察之2023上海车展-----车企发展趋势(3)

合资\外资发展 宝马&#xff1a;i7、iX1新车亮相&#xff0c;未来将持续发力电动化、数字化&#xff08;座舱&#xff09; 宝马在本次车展重点展示了电动化产品&#xff0c;新发车型为i7 M70L、iX1、及i vision Dee概念车等车型。 • 展示重点&#xff1a;电动化数字化&#…

STM32H750之FreeRTOS学习--------(五)临界段代码保护

FreeRTOS 文章目录 FreeRTOS五、临界段代码保护临界段代码保护函数任务级进入临界段任务级退出临界段中断级进入临界段中断级退出临界段 任务调度器的挂起和恢复挂起任务调度器恢复任务调度器挂起任务调度器恢复任务调度器 五、临界段代码保护 临界段代码也叫做临界区&#xf…

Android EditText 实现强制性弹出只能输入英文的键盘

如果 EditText 控件不做任何特殊处理&#xff0c;例如笔者手机默认弹出的是百度输入法的软键盘&#xff0c;可实现中英文切换&#xff0c;并且自带英文单词智能联想功能&#xff08;与系统安装输入法和设置相关&#xff09;。但在某些应用场景下&#xff0c;例如在英语APP里练习…

RabbitMQ(高级特性):限流

消费端限流 在rabbitmq中&#xff0c;使用消费端限流必须开启手动签收信息 过MQ可以对请求进行“削峰填谷”&#xff0c;即通过消费端限流的方式限制消息的拉取速度&#xff0c;达到保护消费端的目的。 生产者批量发送消息&#xff1a; Test public void testSendBatch() {…

DBever 连接trino时区问题 The datetime zone id ‘GMT+08:00‘ is not recognised

DBever连接trino 测试连接成功&#xff0c;但是执行sql报时区不对、如果你默认使用的是大于jdk8的版本 会存在这个问题&#xff0c;因为jdk版本 jdk8 和jdk17 版本默认时区是不同的 trino官网明确说明了时区默认跟jdk走 解决方案 可以先行查看JDK本地时区库版本&#xff0c;执…

Django初窥门径-自定义用户模型

前言 自定义用户模型在Django应用中是一个重要的话题&#xff0c;它涉及到如何根据您的项目需求以及特定的用户身份验证和授权需求来调整用户模型。在以下前言中&#xff0c;我将讲述为什么自定义用户模型是如此重要以及其潜在的优势&#xff1a; 随着Web应用的不断发展&…

工业路由器网关的网络协议之NAT技术

在物联网通讯领域&#xff0c;NAT技术能将内网的一个私有IP转换成一个公网IP去接入互联网&#xff0c;解决组建局域网络时私有IP地址无法在公网上进行路由的问题。 NAT&#xff08;Network Address Translation&#xff09;的三种方式&#xff1a; 静态NAT 1、一个私有IP对应…

在微信小程序中怎么实现刮刮卡抽奖活动

在当今的数字化时代&#xff0c;微信小程序已经成为一种广泛使用的营销工具。通过各种互动活动&#xff0c;企业可以吸引用户的关注&#xff0c;提升品牌影响力。其中&#xff0c;刮刮卡抽奖活动是一种特别受欢迎的形式。本文将为你详细介绍如何在微信小程序中实现刮刮卡抽奖活…

Python中通过socketserver库创建服务端

socketserver库是Python的标准库&#xff0c;提供了套接字服务端的框架&#xff0c;通过该框架可以简化服务端的创建流程。 1 socketserver库的导入 通过如图1显示的代码导入socketserver库。 图1 导入socketserver库 2 通过socketserver库创建TCP服务端 通过socketserver库…

SpringCloud——服务容错——Hystrix

1.现在的微服务存在哪些问题&#xff1f; 在大型的微服务项目中&#xff0c;肯定少不了服务之间多条链路调用&#xff0c;如果调用中有一个服务出现了问题&#xff0c;如果不做任何的处理&#xff0c;就会造成大量的阻塞&#xff0c;可能会导致整个服务雪崩。 2.要解决的问题 …

C盘清理指南(三)——文件目录更改

各位小伙伴你们好&#xff0c;今天的推送是C盘清理系列的第三期——文件路径更改&#xff0c;分为文件夹路径和软件默认路径两个模块。 一&#xff0e;文件夹路径更改 点击进入C盘&#xff0c;依次点击上方“查看——隐藏的项目”&#xff0c;可以看到C盘中各种隐藏目录。 单击…

深度图(Depth Map)

文章目录 深度图深度图是什么深度图的获取方式激光雷达或结构光等传感器的方法激光雷达RGB-D相机 双目或多目相机的视差信息计算深度采用深度学习模型估计深度 深度图的应用场景扩展阅读 深度图 深度图是什么 深度图&#xff08;depth map&#xff09;是一种灰度图像&#xf…

使用 curator 连接 zookeeper 集群 Invalid config event received

dubbo整合zookeeper 如图&#xff0c;错误日志 2023-11-04 21:16:18.699 ERROR 7459 [main-EventThread] org.apache.curator.framework.imps.EnsembleTracker Caller0 at org.apache.curator.framework.imps.EnsembleTracker.processConfigData(EnsembleTracker.java…

为机器学习算法准备数据(Machine Learning 研习之八)

本文还是同样建立在前两篇的基础之上的&#xff01; 属性组合实验 希望前面的部分能让您了解探索数据并获得洞察力的几种方法。您发现了一些数据怪癖&#xff0c;您可能希望在将数据提供给机器学习算法之前对其进行清理&#xff0c;并且发现了属性之间有趣的相关性&#xff0c…

Mysql学习笔记--基础

一&#xff0c;SQL最重要的增删改命令格式 1&#xff0c;insert into 表名&#xff08;不写这个括号里面的内容就默认所有字段都要添加&#xff09; values&#xff08;&#xff09; 插入单条数据 2&#xff0c;insert into 表名 (里面是列名) values&#xff08;根据列名依次…

【qemu逃逸】华为云2021-qemu_zzz

前言 虚拟机用户名&#xff1a;root 无密码 设备逆向 经过逆向分析&#xff0c;可得实例结构体大致结构如下&#xff1a; 其中 self 指向的是结构体本身&#xff0c;cpu_physical_memory_rw 就是这个函数的函数指针。arr 应该是 PCI 设备类结构体没啥用&#xff0c;就直接用…

京东按关键词搜索商品列表接口:竞品分析,商品管理,营销策略制定

京东搜索商品列表接口是京东开放平台提供的一种API接口&#xff0c;通过调用该接口&#xff0c;开发者可以获取京东平台上商品的列表数据&#xff0c;包括商品的标题、价格、库存、月销量、总销量、详情描述、图片等信息。 接口的主要作用包括&#xff1a; 市场调研&#xff…

图形学及图形学进展

有段时间没有来CSDN了&#xff0c;最近一直忙于工作&#xff0c;最近图形学方面&#xff0c;特别是重建图形学方面有了比较大的进展&#xff0c;然后NeRF-SLAM向也有不少进展&#xff0c;但由于ChatGPT风光无限&#xff0c;光芒都没有发出来&#xff0c;后续还是继续创作&#…

华为MateBook X Pro笔记本录屏办法

现象&#xff1a;使用ev录屏软件时录不上耳机声音。在我自己的普惠、华硕笔记本上都没有这个问题。 解决办法&#xff0c;使用华为自己的录屏功能。具体如下&#xff1a; 1、找到‘华为控制中心’&#xff1a; 2、使用‘智慧快录’&#xff1a;

ideal一键部署SpringBoot项目jar包到服务器

一 简介 我们在开发环境部署项目一般通过ideal将项目打包成jar包&#xff0c;然后连接linux服务器&#xff0c;将jar手动上传到服务中&#xff0c;重启服务。 概括的说流程是这样的: 本地打包->上传到服务器->kill掉以前的服务->重新启动jar包服务 每次总是循环这一…