java中的日志框架梳理(以故事的形式呈现)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志算是java工具体系的一个知识点,但又是写代码的时候绕不过去的一个知识点,这篇文章主要是针对于小白,以故事的形式来对目前市场上常见的一些日志框架进行一个介绍和梳理。

阶段一:


从前有一个程序员,名字叫张三,张三呢,每天矜矜业业,业务能力代码能力都很强。老板就让他负责一个比较复杂的系统。于是张三呢,每天使用System.out.println(),在控制台打印出来一些关键的信息。这时候麻烦来了,项目需要上线了,总不能还要把这些没用的信息输出到控制台吧,于是老板让张三把这些语句全部去掉。这么庞大的系统,张三找呀找,终于把所有的System.out语句全部注释掉了。


阶段二:


过了一段时间呢,项目遇到了一些问题,老板突然想起来张三之前写过System.out的相关语句,觉得有必要把一些关键信息打印出来,于是又让张三把所有的System.out语句添加进来,这下子又把张三忙活的不轻,累了一天终于又改过来了。在找出错误之后,然后再重新去掉。


阶段三:


就这样来回折腾了几次,把张三气的不轻,毕竟需求总是会不断的变化的,于是张三考虑做一个框架,记录系统运行的一些必要的信息,这个框架就叫做日志框架,在这里且命名为logging-jar。


阶段四:


在第一代日志框架中,总是会把各种各样的运行信息打印出来,这对于张三来说只想要找出一些错误信息,他必须要在很长的一个控制台去寻找。于是张三考虑着如何改进这个框架,比如说把输出信息分类,有异常信息,有错误信息,还有警告信息等等。这对于张三来说,开发起来太便利了。叫做logging-good-jar。


阶段五:


老板一看,张三业务能力这么强,干脆把其他的一些项目也让张三带吧,于是张三又负责了一些其他的项目,但是问题又来了,其他的项目使用的不是张三的日志框架,而是其他的日志框架,怎么办呢?张三考虑着把这个项目的去掉,换成自己的不就可以了嘛,于是张三去掉了别人的,换成了自己的,又废了半天功夫更改了大量的日志api代码。


阶段六:


随着张三业务能力的不断增强,负责的项目也越来越多,接触到的日志框架也是残次不齐。于是张三考虑定义一些规则接口,其他的任何框架都要有相应的实现方法,这样做的好处就是每次张三就不需要去掉别人的,换成自己的。而是调用相应日志框架的相关实现即可。这个规则就叫做日志门面,也叫做日志框架的抽象层。实现这些规则接口的框架就叫做日志实现框架。

v2-9e112794593198ffd9f165b76a31b4f1_1440w.jpg

目前最受欢迎的就是这么几个。按照使用的角度来说,那就是左边选择一个日志门面,右边选择一个日志实现就好了。就这样他们之前进行了激烈的竞争。


Ceki Gülcü是一个java大佬,一开始发明了log4j,后来把这个捐给了Apache基金会,后来觉得这个功能不够牛,又发明了logback。logback一出来很离开,但是日志门面不能满足需求了,于是乎又设计了slf4j


阶段七:


随着时间的流逝,slf4j门面和logback日志实现框架脱颖而出。于是平时张三就用这个了。但是我们需要知道的是在使用的时候其实用的是日志门面slf4j的方法,而不用关心是哪一个实现的。springboot开发团队,一看这个搭配使用起来是真的好,于是就选用了他俩了。既然这么好,干脆我们使用springboot来整合一下他们俩。


第一步:添加依赖

<dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-classic</artifactId>
</dependency>
<dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>jcl-over-slf4j</artifactId>
</dependency>

第二步:配置日志

在 src\main\resources 路径下创建logback.xml配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="/home" />
    <!--控制台日志, 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!--文件日志, 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    <!--myibatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    <!-- 日志输出级别 -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE"/>
    </root>
</configuration>

上面的这些都是模板代码,你可以直接拿来用。下面我们就直接使用。

第三步:使用

@RestController
@RequestMapping("/logging")
public class Hello{
    @Autowired
    private HelloService helloService;
    private final static Logger logger
            = LoggerFactory.getLogger(Hello.class);
    @GetMapping("/test")
    public String test(){
        logger.info("这是日志框架的输出信息");
        return helloService.test();
    }
}

运行结果就不展示了。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
23 3
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
416 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
2月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
2月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
168 3
|
5天前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
2月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
239 12
基于开源框架Spring AI Alibaba快速构建Java应用
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
43 4
|
2月前
|
消息中间件 Java 数据库连接
Java 反射最全详解 ,框架设计必掌握!
本文详细解析Java反射机制,包括反射的概念、用途、实现原理及应用场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Java 反射最全详解 ,框架设计必掌握!
|
2月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
66 2

热门文章

最新文章