java中日志的级别说明

部署运行你感兴趣的模型镜像

log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。

log4j规定了默认的几个级别:trace<debug<info<warn<error<fatal等。这里要说明一下:

1)级别之间是包含的关系,意思是如果你设置日志级别是trace,则大于等于这个级别的日志都会输出。

2)基本上默认的级别没多大区别,就是一个默认的设定。你可以通过它的API自己定义级别。你也可以随意调用这些方法,不过你要在配置文件里面好好处理了,否则就起不到日志的作用了,而且也不易读,相当于一个规范,你要完全定义一套也可以,不用没多大必要。

  • ALL:最低等级的,用于打开所有日志记录。

  • TRACE(追踪): 就是程序推进一下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。

  • DEBUG: 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。

  • INFO: 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。

  • WARN: 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。

  • ERROR: 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。

  • FATAL: 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。

  • OFF: 最高等级的,用于关闭所有日志记录。

如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来。例如,如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常 输出,而INFO、DEBUG、TRACE、 ALL级别的log则会被忽略。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。

从我们实验的结果可以看出,log4j默认的优先级为ERROR或者WARN(实际上是ERROR)。

日志调用demo

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Hello {

    static Logger logger = LogManager.getLogger(Hello.class.getName());

    public boolean hello() {
        logger.entry();   //trace级别的信息,单独列出来是希望你在某个方法或者程序逻辑开始的时候调用,和logger.trace("entry")基本一个意思
        logger.error("Did it again!");   //error级别的信息,参数就是你输出的信息
        logger.info("我是info信息");    //info级别的信息
        logger.debug("我是debug信息");
        logger.warn("我是warn信息");
        logger.fatal("我是fatal信息");
        logger.log(Level.DEBUG, "我是debug信息");   //这个就是制定Level类型的调用:谁闲着没事调用这个,也不一定哦!
        logger.exit();    //和entry()对应的结束方法,和logger.trace("exit");一个意思
        return false;
    }
}  
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info">
	<Properties>
		<!-- 根目录 -->
		<Property name="baseDir">log</Property>
		<!-- 保存最近N天 ,单位:d m y,注意:设置的天数比实际保存的天数多一天,例如设置7d,则实际保存的天数为8d. -->
		<Property name="saveDays">30d</Property>
		<!-- 每一类文件最大压缩个数 -->
		<Property name="fileCountPerCategory">200</Property>
		<!-- 每一类文件大小 单位:KB MB GB ,例如:50 MB -->
		<Property name="fileSizePerCategory">50 MB</Property>
		<!-- 日志开头输出内容格式 -->
		<Property name="globalPatternLayout">%d %-5p %m%n %ex</Property>
		<Property name="filePatternLayout" >%-d [%t] %-5p %c %L - %m%n %ex</Property>
		<!-- 全局日志级别 -->
		<Property name="loglevel">info</Property>
	</Properties>

	<appenders>
<!-- %-5p row: %L, time: %-4r %m%n -->
		<Console name="STDOUT" target="SYSTEM_OUT">
			<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
			<PatternLayout pattern="${globalPatternLayout}" />
		</Console>

		<RollingFile name="TASK_DEBUG"
			fileName="${baseDir}/task_debug.log"
			filePattern="${baseDir}/$${date:yyyyMMdd}/task_debug-%d{yyyy-MM-dd}-%i.log.zip"
			><!--filePattern="${baseDir}/$${date:yyyyMMdd}/task_debug-%d{yyyy-MM-dd}-%i.log.gz" -->
			<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
			<PatternLayout pattern="${filePatternLayout}" />
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1" />
				<SizeBasedTriggeringPolicy size="${fileSizePerCategory}" />
			</Policies>
			<DefaultRolloverStrategy max="${fileCountPerCategory}">
				<Delete basePath="${baseDir}" maxDepth="2">
					<IfFileName glob="*/task_debug-*.log.gz">
						<IfLastModified age="${saveDays}">
							<IfAny>
								<IfAccumulatedFileSize
									exceeds="${fileSizePerCategory}" />
								<IfAccumulatedFileCount exceeds="2" />
							</IfAny>
						</IfLastModified>
					</IfFileName>
				</Delete>
			</DefaultRolloverStrategy>
		</RollingFile>

		<RollingFile name="TASK_RESULT"
			fileName="${baseDir}/task_result.log"
			filePattern="${baseDir}/$${date:yyyyMMdd}/task_result-%d{yyyy-MM-dd}-%i.log.zip"
			><!--filePattern="${baseDir}/$${date:yyyyMMdd}/task_debug-%d{yyyy-MM-dd}-%i.log.gz" -->
			<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
			<PatternLayout pattern="${filePatternLayout}" />
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1" />
				<SizeBasedTriggeringPolicy size="${fileSizePerCategory}" />
			</Policies>
			<DefaultRolloverStrategy max="${fileCountPerCategory}">
				<Delete basePath="${baseDir}" maxDepth="2">
					<IfFileName glob="*/task_result-*.log.gz">
						<IfLastModified age="${saveDays}">
							<IfAny>
								<IfAccumulatedFileSize
									exceeds="${fileSizePerCategory}" />
								<IfAccumulatedFileCount exceeds="2" />
							</IfAny>
						</IfLastModified>
					</IfFileName>
				</Delete>
			</DefaultRolloverStrategy>
		</RollingFile>
		<RollingFile name="TASK_DOWNLOAD"
					 fileName="${baseDir}/task_download.log"
					 filePattern="${baseDir}/$${date:yyyyMMdd}/task_download-%d{yyyy-MM-dd}-%i.log.zip"
		><!--filePattern="${baseDir}/$${date:yyyyMMdd}/task_debug-%d{yyyy-MM-dd}-%i.log.gz" -->
			<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
			<PatternLayout pattern="${filePatternLayout}" />
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1" />
				<SizeBasedTriggeringPolicy size="${fileSizePerCategory}" />
			</Policies>
			<DefaultRolloverStrategy max="${fileCountPerCategory}">
				<Delete basePath="${baseDir}" maxDepth="2">
					<IfFileName glob="*/task_download-*.log.gz">
						<IfLastModified age="${saveDays}">
							<IfAny>
								<IfAccumulatedFileSize
										exceeds="${fileSizePerCategory}" />
								<IfAccumulatedFileCount exceeds="2" />
							</IfAny>
						</IfLastModified>
					</IfFileName>
				</Delete>
			</DefaultRolloverStrategy>
		</RollingFile>
		<RollingFile name="TASK_OPERATE"
			fileName="${baseDir}/task_operate.log"
			filePattern="${baseDir}/$${date:yyyyMMdd}/task_operate-%d{yyyy-MM-dd}-%i.log.zip"
			><!--filePattern="${baseDir}/$${date:yyyyMMdd}/task_debug-%d{yyyy-MM-dd}-%i.log.gz" -->
			<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
			<PatternLayout pattern="${filePatternLayout}" />
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1" />
				<SizeBasedTriggeringPolicy size="${fileSizePerCategory}" />
			</Policies>
			<DefaultRolloverStrategy max="${fileCountPerCategory}">
				<Delete basePath="${baseDir}" maxDepth="2">
					<IfFileName glob="*/task_operate-*.log.gz">
						<IfLastModified age="${saveDays}">
							<IfAny>
								<IfAccumulatedFileSize
									exceeds="${fileSizePerCategory}" />
								<IfAccumulatedFileCount exceeds="2" />
							</IfAny>
						</IfLastModified>
					</IfFileName>
				</Delete>
			</DefaultRolloverStrategy>
			
		</RollingFile>
		<RollingFile name="TASK_ERROR"
			fileName="${baseDir}/task_error.log"
			filePattern="${baseDir}/$${date:yyyyMMdd}/task_error-%d{yyyy-MM-dd}-%i.log.zip"
			><!--filePattern="${baseDir}/$${date:yyyyMMdd}/task_debug-%d{yyyy-MM-dd}-%i.log.gz" -->
			<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
			<PatternLayout pattern="${filePatternLayout}" />
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1" />
				<SizeBasedTriggeringPolicy size="${fileSizePerCategory}" />
			</Policies>
			<DefaultRolloverStrategy max="${fileCountPerCategory}">
				<Delete basePath="${baseDir}" maxDepth="2">
					<IfFileName glob="*/task_error-*.log.gz">
						<IfLastModified age="${saveDays}">
							<IfAny>
								<IfAccumulatedFileSize
									exceeds="${fileSizePerCategory}" />
								<IfAccumulatedFileCount exceeds="2" />
							</IfAny>
						</IfLastModified>
					</IfFileName>
				</Delete>
			</DefaultRolloverStrategy>
		</RollingFile>
		<RollingFile name="TASK_SQL"
			fileName="${baseDir}/task_sql.log"
			filePattern="${baseDir}/$${date:yyyyMMdd}/task_sql-%d{yyyy-MM-dd}-%i.log.zip"
			><!--filePattern="${baseDir}/$${date:yyyyMMdd}/task_debug-%d{yyyy-MM-dd}-%i.log.gz" -->
			<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
			<PatternLayout pattern="${filePatternLayout}" />
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1" />
				<SizeBasedTriggeringPolicy size="${fileSizePerCategory}" />
			</Policies>
			<DefaultRolloverStrategy max="${fileCountPerCategory}">
				<Delete basePath="${baseDir}" maxDepth="2">
					<IfFileName glob="*/task_sql-*.log.gz">
						<IfLastModified age="${saveDays}">
							<IfAny>
								<IfAccumulatedFileSize
									exceeds="${fileSizePerCategory}" />
								<IfAccumulatedFileCount exceeds="2" />
							</IfAny>
						</IfLastModified>
					</IfFileName>
				</Delete>
			</DefaultRolloverStrategy>
		</RollingFile>
		<RollingFile name="TASK_HANDLE"
			fileName="${baseDir}/task_handle.log"
			filePattern="${baseDir}/$${date:yyyyMMdd}/task_handle-%d{yyyy-MM-dd}-%i.log.zip"
			><!--filePattern="${baseDir}/$${date:yyyyMMdd}/task_debug-%d{yyyy-MM-dd}-%i.log.gz" -->
			<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
			<PatternLayout pattern="${filePatternLayout}" />
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1" />
				<SizeBasedTriggeringPolicy size="${fileSizePerCategory}" />
			</Policies>
			<DefaultRolloverStrategy max="${fileCountPerCategory}">
				<Delete basePath="${baseDir}" maxDepth="2">
					<IfFileName glob="*/task_handle-*.log.gz">
						<IfLastModified age="${saveDays}">
							<IfAny>
								<IfAccumulatedFileSize
									exceeds="${fileSizePerCategory}" />
								<IfAccumulatedFileCount exceeds="2" />
							</IfAny>
						</IfLastModified>
					</IfFileName>
				</Delete>
			</DefaultRolloverStrategy>
		</RollingFile>
		<!--mos ssm sdk-->
		<RollingFile name="MOSSDK"
					 fileName="${baseDir}/task_mossdk.log"
					 filePattern="${baseDir}/$${date:yyyyMMdd}/task_mossdk-%d{yyyy-MM-dd}-%i.log.zip"
		><!--filePattern="${baseDir}/$${date:yyyyMMdd}/task_debug-%d{yyyy-MM-dd}-%i.log.gz" -->
			<PatternLayout pattern="${filePatternLayout}" />
			<Policies>
				<TimeBasedTriggeringPolicy modulate="true" interval="1" />
				<SizeBasedTriggeringPolicy size="${fileSizePerCategory}" />
			</Policies>
			<DefaultRolloverStrategy max="${fileCountPerCategory}">
				<Delete basePath="${baseDir}" maxDepth="2">
					<IfFileName glob="*/task_operate-*.log.gz">
						<IfLastModified age="${saveDays}">
							<IfAny>
								<IfAccumulatedFileSize
										exceeds="${fileSizePerCategory}" />
								<IfAccumulatedFileCount exceeds="2" />
							</IfAny>
						</IfLastModified>
					</IfFileName>
				</Delete>
			</DefaultRolloverStrategy>
		</RollingFile>
	</appenders>

	<loggers>

		<AsyncLogger name="com.rootnet" level="debug"
			includeLocation="false" additivity="false">
			<AppenderRef ref="TASK_DEBUG" />
			<AppenderRef ref="TASK_ERROR" />
		</AsyncLogger>
		<AsyncLogger name="TASK_OPERATE" level="info" includeLocation="false" additivity="false">
			<AppenderRef ref="TASK_OPERATE" />
		</AsyncLogger>
		<!-- 记录操作日志结束 -->

	<!-- 输出屏幕结果日志 -->
		<AsyncLogger name="TASK_RESULT" level="info"
			includeLocation="false" additivity="false">
			<AppenderRef ref="TASK_RESULT" />
		</AsyncLogger>

		<AsyncLogger name="TASK_DOWNLOAD" level="info"
					 includeLocation="false" additivity="false">
			<AppenderRef ref="TASK_DOWNLOAD" />
		</AsyncLogger>

		<!-- SQL日志 com.ibatis.sqlmap.engine.impl.SqlMapClientImpl -->
		
		 <!--<AsyncLogger name="java.sql" level="debug"
			includeLocation="false" additivity="false">
			<AppenderRef ref="TASK_SQL" />
			<appender-ref ref="STDOUT" />
		</AsyncLogger> -->
		<AsyncLogger name="java.sql.PreparedStatement" level="debug"
			  additivity="false">
			<AppenderRef ref="TASK_SQL" />
		</AsyncLogger>
			<AsyncLogger name="java.sql.Statement" level="debug"
			  additivity="false">
			<AppenderRef ref="TASK_SQL" />
		</AsyncLogger>	
		<AsyncLogger name="java.sql.ResultSet" level="debug"
			  additivity="false">
			<AppenderRef ref="TASK_SQL" />
		</AsyncLogger>
		<!-- 每笔详细信息 -->
		<AsyncLogger name="com.rootnet.stocksync.handle" level="debug"
			includeLocation="false" additivity="false">
			<AppenderRef ref="TASK_HANDLE" />
		</AsyncLogger>
		
		<AsyncRoot level="debug" includeLocation="false">
			<appender-ref ref="STDOUT" />
			<appender-ref ref="TASK_DEBUG" />
		</AsyncRoot>

		<!--mos ssm sdk-->
		<AsyncLogger name="sdk.postmsg" level="debug"
					 additivity="false">
			<AppenderRef ref="MOSSDK" />
		</AsyncLogger>
		<AsyncLogger name="sdk.postmsg.comm" level="debug"
					 additivity="false">
			<AppenderRef ref="MOSSDK" />
		</AsyncLogger>
		<AsyncLogger name="sdk.postmsg.biz" level="debug"
					 additivity="false">
			<AppenderRef ref="MOSSDK" />
		</AsyncLogger>
	</loggers>

</configuration>

先简单介绍一下下面这个配置文件。

1)根节点configuration,然后有两个子节点:appenders和loggers(都是复数,意思就是可以定义很多个appender和logger了)(如果想详细的看一下这个xml的结构,可以去jar包下面去找xsd文件和dtd文件)

2)appenders:这个下面定义的是各个appender,就是输出了,有好多类别,这里也不多说(容易造成理解和解释上的压力,一开始也未必能听懂,等于白讲),先看这个例子,只有一个Console,这些节点可不是随便命名的,Console就是输出控制台的意思。然后就针对这个输出设置一些属性,这里设置了PatternLayout就是输出格式了,基本上是前面时间,线程,级别,logger名称,log信息等,差不多,可以自己去查他们的语法规则。

3)loggers下面会定义许多个logger,这些logger通过name进行区分,来对不同的logger配置不同的输出,方法是通过引用上面定义的logger,注意,appender-ref引用的值是上面每个appender的name,而不是节点名称。

配置文件中name的机制

我们上面的这个配置文件里面还定义了一个logger,他的名称是 cn.lsw.base.log4j2.Hello ,这个名称其实就是通过前面的Hello.class.getName(); 得到的,我们为了给他单独做配置,这里就生成对于这个类的logger,上面的配置基本的意思是只有cn.lsw.base.log4j2.Hello 这个logger输出trace信息,也就是他的日志级别是trace,其他的logger则继承root的日志配置,日志级别是error,只能打印出ERROR及以上级别的日志。如果这里logger 的name属性改成cn.lsw.base,则这个包下面的所有logger都会继承这个log配置(这里的包是log4j的logger name的“包”的含义,不是java的包,你非要给Hello生成一个名称为“myhello”的logger,他也就没法继承cn.lsw.base这个配置了。

那有人就要问了,他不是也应该继承了root的配置了么,那么会不会输出两遍呢?我们在配置文件中给了解释,如果你设置了additivity=“false”,就不会输出两遍,

一个复杂的例子

<?xml version="1.0" encoding="UTF-8"?>

<configuration status="error">
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--这个都知道是输出日志的格式-->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>
        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFile" fileName="logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
        </RollingFile>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--建立一个默认的root的logger-->
        <root level="trace">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="Console"/>
        </root>

    </loggers>
</configuration>

参考文章:https://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>好的,用户让我介绍一下Java日志级别。首先,我需要确认自己对Java日志框架的了解。常用的有Log4j、Logback和java.util.logging(JUL)。虽然它们的实现不同,但日志级别大致相似。 接下来,得理清楚各个级别的顺序和用途。常见的级别从低到高应该是TRACE、DEBUG、INFO、WARN、ERROR、FATAL。不过要注意,像JUL可能没有FATAL级别,而Log4j 2.x有。需要指出不同框架间的差异。 然后,每个级别对应的使用场景是什么?比如TRACE用于最详细的跟踪信息,DEBUG调试时的详细信息,INFO正常的运行信息,WARN潜在的问题,ERROR错误事件,FATAL导致应用退出的严重事件。需要举一些例子,让用户更容易理解。 另外,配置日志级别的重要性。比如设置级别为WARN的话,低于WARN的日志不会被记录。要说明如何通过配置文件调整级别,不同的框架可能有不同的配置方式,但可以统一提一下常见的配置方法。 还要注意用户可能的问题,比如为什么需要多个级别,如何选择合适的级别,以及在实际开发中如何结合使用。可能用户在使用日志时遇到效率问题,或者日志过多过少的情况,可以简单提到最佳实践,比如在生产环境中使用INFO或WARN,开发时用DEBUG。 最后,检查是否有遗漏的点,比如SLF4J作为门面模式的作用,或者日志级别的继承关系,但可能用户只需要基础介绍,暂时不需要深入。保持回答简洁明了,结构清晰,分点列出级别,再说明配置和使用场景,再举例子,这样用户容易理解。</think>Java 日志级别日志框架中控制日志输出的核心机制,主要通过优先级划分实现日志过滤。以下是逐步说明: #### 一、常见日志级别(从低到高) 1. **TRACE** - 最细粒度日志 - 示例:记录方法内部循环变量变化 ```java logger.trace("循环索引 i={}", i); ``` 2. **DEBUG** - 调试关键信息 - 示例:输出数据库连接参数 ```java logger.debug("数据库连接池初始化完成,url={}", jdbcUrl); ``` 3. **INFO** - 系统运行状态 - 示例:记录服务启动完成 ```java logger.info("用户服务已在8080端口启动"); ``` 4. **WARN** - 潜在异常但系统仍可运行 - 示例:检测到低磁盘空间 ```java logger.warn("磁盘剩余空间不足10%"); ``` 5. **ERROR** - 业务功能受损的严重错误 - 示例:订单支付失败 ```java logger.error("支付接口调用失败,订单ID={}", orderId); ``` 6. **FATAL** - 导致系统崩溃的致命错误 - 示例:JVM内存溢出 ```java logger.fatal("OutOfMemoryError: Java heap space"); ``` #### 二、重要特性 1. **继承关系** - 日志级别遵循父子继承 - 包级配置示例: ```properties # logback.xml <logger name="com.example.service" level="DEBUG"/> ``` 2. **性能优化** - 使用占位符避免字符串拼接开销 ```java // 推荐写法 logger.debug("用户ID={}, 操作类型={}", userId, actionType); // 避免写法 logger.debug("用户ID=" + userId + ", 操作类型=" + actionType); ``` #### 三、配置示例(Log4j2) ```xml <Configuration> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> <!-- 开发环境开启DEBUG --> <Logger name="com.example.dao" level="debug" additivity="false"/> </Loggers> </Configuration> ``` #### 四、最佳实践 1. **生产环境配置** - 推荐级别:WARN + ERROR - 高频操作日志需采样记录 2. **日志等级选择原则** - DEBUG:开发/测试环境问题定位 - INFO:关键业务流程跟踪 - ERROR:必须人工介入的问题 3. **分布式系统注意事项** - 统一日志级别标准 - 使用`MDC`记录跟踪ID ```java MDC.put("traceId", UUID.randomUUID().toString()); logger.info("开始处理请求"); ``` 通过合理使用日志级别,可以平衡系统可观测性与性能开销,建议结合监控系统实现动态日志级别调整。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值