我已经阅读了2小时的logback手册,仍然无法想象如何做我需要的.
它就像标题所说的那样简单:我只想将错误记录到文件中,而将其他级别(包括ERROR)记录到控制台.
这是我的logcat.xml文件的根部分:
<root level="TRACE" >
<appender-ref ref="CONSOLE_APPENDER" />
<appender-ref ref="FILE_APPENDER" />
</root>
Run Code Online (Sandbox Code Playgroud)
此配置的问题是它将每个级别> = TRACE记录到两个appender.
我可以让root用户只用控制台,并定义一个文件记录器:
<logger name='file_logger' level='ERROR' >
<appender-ref ref="FILE_APPENDER" />
</logger>
Run Code Online (Sandbox Code Playgroud)
但是我必须像这样调用普通记录器:
LoggerFactory.getLogger(ClientClass.class);
Run Code Online (Sandbox Code Playgroud)
和文件记录器这样:
LoggerFactory.getLogger("file_logger");
Run Code Online (Sandbox Code Playgroud)
我不想为每个班级选择记录器.我只想使用class as参数从工厂获取根记录器,并根据级别让它做正确的事情.
这可能吗?
我正在尝试使用params for Spring Boot JDBC进行日志SQL查询,但它没有在日志中打印详细信息.我正在使用Spring Boot 1.5.8版本.请帮我解决这个问题.
application.properties:
spring.datasource.url=url
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
logging.level.org.springframework.jdbc.core.JdbcTemplate=debug
spring.datasource.type = com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.maximum-pool-size=2
Run Code Online (Sandbox Code Playgroud)
库:
@Repository
public class DataRepository {
private static Logger log = LoggerFactory.getLogger(DataRepository.class);
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;
public Data findDataObjet() throws Exception {
Map<String, Object> parameters = new HashMap<>();
parameters.put("id1", "mike");
parameters.put("id2", new Long(1));
String sqlString = "select * from table1 where id1 = ":id" and id2 = :id2";
log.info("Query:" + sqlString);//this log is printing
Data extObj = jdbcTemplate.query(sqlString, parameters, (rs) -> { …Run Code Online (Sandbox Code Playgroud) 参考:Logback的配置
我的配置可以包含
...at most one <root> element...
但是后来在同一个文档中,在讨论条件时,我看到了这一点:
<configuration debug="true">
<if condition='property("HOSTNAME").contains("torino")'>
<then>
<appender name="CON" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root> <------ root logger #1
<appender-ref ref="CON" />
</root>
</then>
</if>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${randomOutputDir}/conditional.log</file>
<encoder>
<pattern>%d %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="ERROR"> <------ root logger #2
<appender-ref ref="FILE" />
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
注意有两个<root>元素!我很困惑,因为我没有看到任何<else>元素,我会假设 FILE 附加程序和第二个根记录器仍在运行,即使主机名是“torino”。
这是一个如何有效的例子?为什么<root>在这种情况下允许两个记录器,而一个不在一个<if>或一个<else>
我错过了什么???