我有一个扩展PatternLayout的自定义log4j布局类,我的布局类只是掩盖了日志中的密码。它适用于简单的控制台应用程序。这是log4j.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="A1" class="org.apache.log4j.ConsoleAppender">
<layout class="com.PortalLog4jFilteringPattern"> <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/> </layout>
</appender>
<root>
<priority value ="DEBUG" /> <appender-ref ref="A1" />
</root>
</log4j:configuration>
这是布局类的一部分:
public class PortalLog4jFilteringPattern extends PatternLayout {
// omitted
@Override
public String format(LoggingEvent event) {
System.out.println("in format()...... ");
// rest omitted
这是调用代码:
import org.apache.log4j.Logger;
public class ProductDemo {
private static Logger logger = Logger.getLogger(ProductDemo.class);
public ProductDemo() {
}
public void processOrder(CustomerOrder order) {
logger.info(order.getProductName());
}
// rest ommited
屏蔽了pswd的示例结果日志:
main INFO test.ProductDemo - "password":"*****"},
但是一旦我将自定义布局类移动到我的webapp(log4j.xml完全相同。),它就不会被调用(即没有System.out输出)并且仍然显示pswd。我使用此cmd在Jetty上使用maven在本地运行webapp:mvn jetty:run
这是调用代码:
// original code, but I changed it to import org.apache.log4j.Logger for experiment
//import org.slf4j.LoggerFactory;
//import org.slf4j.Logger;
import org.apache.log4j.Logger;
public class BlahBlahClass extends Blah
// things omitted
private final static Logger log = Logger.getLogger( BlahBlahClass .class );
有什么想法吗?感谢
答案 0 :(得分:0)
在Java EE服务器环境中,我会说:这是一个类加载器问题。 Jetty是一个servlet容器,所以它的类加载架构更简单;不过,值得一试。如果你的log4j 不是部署在WAR中,而是来自Jetty类路径,这几乎肯定是原因。
尝试将类加载策略更改为“父级最后”,如the Jetty manual中所述,看看是否有帮助。
答案 1 :(得分:0)
您应该在log4j中导入您的类的包名称。我将log4j2.xml添加如下:
public List<VerseInfo> ReadFromStorage(String Translation, String Bookspec, int Chapter, int StartingVerse, int EndingVerse)
{
...code here
var bookResult = client.CreateDocumentQuery<CosmosBook>(UriFactory.CreateDocumentCollectionUri(_connInfo["DatabaseId"], "books"), new FeedOptions { EnableCrossPartitionQuery = true , MaxItemCount = 1})
.Where(b => b.Matchspec.Contains($"[{Bookspec}]"))
.AsDocumentQuery()
.ExecuteNextAsync<CosmosBook>().Result;
...code here
return vList;
}