通过 System.out,您可以:
System.out.print
System.out.println
Run Code Online (Sandbox Code Playgroud)
有时我不需要换行符(例如当我打印“关于提交事务...完成”时)。使用 System.out 我会这样做:
System.out.print("About to commit transaction...");
System.out.println("done.");
Run Code Online (Sandbox Code Playgroud)
我不知道如何在 log4j 中执行此操作。我的 log4j 属性文件有这样的:
log4j.rootLogger=DEBUG, CA
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%-30c{1} %x %-30M - %m%n
Run Code Online (Sandbox Code Playgroud)
我不想简单地删除“%n”并且必须在每个日志记录语句中指定它。
这在 Log4j 中可能吗?
我想在运行时在log4j2中关闭我的调试语句.根据文档,我们可以做到这一点.我将我的log4j.xml文件保存在默认包中,然后将jar放在其中.因为我无法使用Dlog4j.configuration =/path/to/log4j.xml修改jar我指定的xml文件.但是,这不起作用.我使用file:// uri尝试了所有组合的所有内容,但仍然没有选择xml.
我目前正在创建一个可以拥有模块的系统(将它们视为插件),其中每个模块都可以拥有自己的专用日志.
我想使用log4j2项目进行日志记录,但我似乎对文件appender有些麻烦.
主项目(模块加载器和整个事物的"核心")应该有自己的日志文件,而模块应该有自己的(如mod_XXXXXXXX.log).
通过阅读有关appender的文档,我发现了这个FileAppender类,我打算使用它.直到我发现我不能简单地将appender添加到由创建的默认记录器LogManager.getLog().
LogManager返回的记录器是与Logger接口不同的记录器.
甚至搜索都没有给我任何近乎解决方案,我发现只是xml配置中的预定义文件日志 - 这不是我想要的.
谢谢你的阅读; 即使是最轻微的线索也欢迎:)
我将我公司的系统配置为通过将系统属性设置Log4jContextSelector为org.apache.logging.log4j.core.async.AsyncLoggerContextSelector. 我们使用 log4j 2.0。
当我通过系统运行一个小的输入文件时没有问题。但是当我运行一个更大的输入文件时(我们的系统应该运行比这个更大的文件),OutOfMemoryError是造成的。信息如下:
SEVERE: Exception processing: 14451294 org.apache.logging.log4j.core.async.RingB ufferLogEvent@226dc6bf
java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)
然后我将最大堆大小增加到 4 gigs(总物理内存为 8G),并导致了另一个问题:
SEVERE: Exception processing: 775221 org.apache.logging.log4j.core.async.RingBufferLogEvent@1c6b80a9
java.lang.OutOfMemoryError: GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud) 我正在使用log4j2-beta9,我有以下配置(部分):
<Appenders>
<SMTP name="Mailer" suppressExceptions="false"
subject="${subject}" to="${receipients}" from="${from}"
smtpHost="${smtpHost}" smtpPort="${smtpPort}"
smtpProtocol="${smtpProtocol}" smtpUsername="${smtpUser}"
smtpPassword="${smtpPassword}" smtpDebug="false" bufferSize="20">
<PatternLayout>
<pattern>%d{dd-MM-yyyy HH:mm:ss,SSS} %5p %m%n</pattern>
</PatternLayout>
</SMTP>
<Async name="AsyncMailer">
<AppenderRef ref="Mailer"/>
</Async>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="AsyncMailer" level="error"/>
</Root>
</Loggers>
Run Code Online (Sandbox Code Playgroud)
使用此配置,我只收到1(一)错误消息的电子邮件.如何配置log4j2以接收1条错误消息和N条以前的LEVEL = INFO消息?
提前致谢.
我正在使用log4j2和slf4j以及hibernate 4.3.1.我在显示SQL查询的参数时遇到问题.我没有找到任何显示它们(SQL查询很好地显示但没有参数).这是我在persistence.xml中指定的内容:
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="xxxxx" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<property name="hibernate.query.factory_class"
value="org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory" />
<property name="max_fetch_depth" value="2" />
<property name="hibernate.jdbc.batch_size" value="100" />
</properties>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)
我在log4j2.xml中定义了这个:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG" verbose="true">
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n" />
</Console>
<File name="MyFile" fileName="test.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<logger name="org.hibernate.SQL" level="DEBUG" …Run Code Online (Sandbox Code Playgroud) 我创建了一个JDBC appender并绑定了ColumnConfig和DataSourceConnectionSource.
在尝试在DB中插入记录时(Logger.debug("Test")).我得到的是异常.
谢谢
[6/16/14 18:44:58:647 GMT-08:00] 00000024 SystemErr R ERROR StatusLogger An exception occurred processing Appender JDBCAppender org.apache.logging.log4j.core.appender.AppenderLoggingException: Failed to insert record for log event in JDBC manager: DSRA1300E: Feature is not implemented: PreparedStatement.setNString
at org.apache.logging.log4j.core.appender.db.jdbc.JDBCDatabaseManager.writeInternal(JDBCDatabaseManager.java:117)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseManager.write(AbstractDatabaseManager.java:159)
at org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender.append(AbstractDatabaseAppender.java:103)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:97)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:425)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:406)
at org.apache.logging.log4j.core.Logger$PrivateConfig.logEvent(Logger.java:275)
at org.apache.logging.log4j.core.async.AsyncLogger.actualAsyncLog(AsyncLogger.java:289)
at org.apache.logging.log4j.core.async.RingBufferLogEvent.execute(RingBufferLogEvent.java:99)
at org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:43)
at org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:28)
at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:133)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:897)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:919)
at java.lang.Thread.run(Thread.java:736)
Caused by: java.sql.SQLFeatureNotSupportedException: DSRA1300E: Feature is not implemented: PreparedStatement.setNString
at com.ibm.ws.rsadapter.AdapterUtil.notSupportedX(AdapterUtil.java:1306)
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.setNString(WSJdbcPreparedStatement.java:2362)
at org.apache.logging.log4j.core.appender.db.jdbc.JDBCDatabaseManager.writeInternal(JDBCDatabaseManager.java:104) …Run Code Online (Sandbox Code Playgroud) 如何在 log4j2 中设置 Async Logger 和 Async Appender 的线程数?默认使用一个线程吗?
我尝试运行一批 100,000 条记录,但我没有看到使用 system.out.print 显示的最后一个日志语句时间和应用程序退出的结束时间戳有任何差异。我如何证明这是异步日志记录?
<RollingFile name="APP.ALERT" fileName="C:\Users\sbasheer\Downloads\abc\Alert.log"
filePattern="C:\Users\sbasheer\Downloads\abc\Alert%d{MM-dd-yyyy}-%i.log" immediateFlush="true" append="true">
<PatternLayout>
<Pattern>%d %p %class{1.} [%t] %location %m %ex%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="25 MB"/>
</Policies>
<DefaultRolloverStrategy max="50"/>
</RollingFile>
<AsyncLogger name="com.abc.asyncsample" level="trace" includeLocation="true" additivity="true">
<AppenderRef ref="APP.ALERT" level="error" />
</AsyncLogger>
Run Code Online (Sandbox Code Playgroud) 文件org.apache.logging.log4j.Logger说
/**
* Logs a message with parameters at the given level.
*
* @param level the logging level
* @param message the message to log; the format depends on the message factory.
* @param params parameters to the message.
* @see #getMessageFactory()
*/
void log(Level level, String message, Object... params);
Run Code Online (Sandbox Code Playgroud)
但:
更新:
请在答案中添加类名和XML元素名称.没有正确的搜索条件,很难在谷歌上找到关于Log4J 2.x的任何信息.
我正在使用log4j2(版本-2.5),我正在尝试编写一个消息转换器插件,它将掩盖日志消息的一些已知模式.
@Plugin(name = "CustomeMasking",
category = "Converter")
@ConverterKeys({"m"})
public class MyCustomFilteringLayout extends LogEventPatternConverter {
}
Run Code Online (Sandbox Code Playgroud)
当我使用此插件运行我的Web应用程序时,我看到此警告消息
WARN转换器键'm'已映射到'class org.apache.logging.log4j.core.pattern.MessagePatternConverter'.对不起,戴夫,我不能让你那样做!忽略插件[类MyCustomFilteringLayout].
在探索log4j2网站后,我找到了这些参考资料.
如果多个转换器指定相同的ConverterKeys,则上面的加载顺序将确定将使用哪个.例如,要覆盖由内置DatePatternConverter类提供的%date转换器,您需要将插件放在log4j-core.jar之前的CLASSPATH中的JAR文件中.不推荐这样做; 模式ConverterKeys冲突将导致发出警告.尝试将独特的ConverterKeys用于自定义模式转换器.
我需要帮助才能理解如何为m/msg编写自定义转换器.有没有更好的方法呢?
其他细节: 我为MyCustomFilteringLayout创建了阴影jar.我这样做的原因是我希望将屏蔽逻辑与应用程序分开.
更新
我为自己的密钥创建了转换器,看起来像这样,
@Plugin(name = "CustomeMasking",
category = "Converter")
@ConverterKeys({"cm"})
public class MyCustomFilteringLayout extends LogEventPatternConverter {
}
Run Code Online (Sandbox Code Playgroud)
在这里,我不能为同一个ConverterKeys写入另一个转换器 - 厘米?现在我的log4j2.xml有这个模式布局,
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %cm %ex%n</Pattern>
</PatternLayout>
Run Code Online (Sandbox Code Playgroud) java ×10
log4j2 ×10
logging ×10
log4j ×8
asynchronous ×1
hibernate ×1
jdbc ×1
newline ×1
slf4j ×1
smtpappender ×1