我现在花了几个小时试图解决这个问题并完全失败.我发现新的配置过程不必要地复杂.
我有一个带有web.xml文件的Servlet,其中包含以下内容:
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>file:///etc/myApp/log4j2.xml</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
它似乎没有任何影响.我使用的是Tomcat 7.0.42,我已经删除了catalina.properties文件中对log4j*.jar的所有引用.我的应用程序中的日志仍在发送,但它们只是被发送到System.out而没有我指定的格式.
所以,我试着亲自手工完成:
InputStream in =
new FileInputStream(new File("/etc/myApp/log4j2.xml"));
ConfigurationSource source = new ConfigurationSource(in);
ConfigurationFactory factory = new XMLConfigurationFactory();
Configuration configuration = factory.getConfiguration(source);
LoggerContext context = (LoggerContext) LogManager.getContext();
context.start(configuration);
context.updateLoggers();
Logger.getLogger("Test").log(Level.INFO, "This is a logging message.");
Run Code Online (Sandbox Code Playgroud)
首先,这似乎完全令人费解.显然,存在一些代码将通过"log4jConfiguration"属性搜索不同的文件并基于其扩展来假设文件类型,那么为什么不LogManger.reconfigure(String)具有相同的效果呢?
其次,这也没有效果.同样,日志将打印到System.out,并且没有执行任何请求的格式.
这是我的log4j2.xml的内容:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="LogFile" fileName="/var/log/myApp/myApp.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %p %c{1.} [%t] %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="DEBUG">
<AppenderRef …Run Code Online (Sandbox Code Playgroud) 一般用例
想象一个客户端正在上传大量JSON。应该保留Content-Type,application/json因为它描述了实际数据。Accept-Encoding和Transfer-Encoding似乎是在告诉服务器应如何格式化响应。看来,响应为此目的明确使用了Content-Encoding头,但这不是有效的请求头。
我有什么想念的吗?有没有人找到一个优雅的解决方案?
具体用例
我的用例是,我有一个移动应用程序,该应用程序生成大量JSON(在某些情况下会生成一些JSON数据,但程度较小),并且压缩请求可以节省大量带宽。我使用Tomcat作为我的Servlet容器。我将Spring用于它的MVC注释,主要是为了将JEE的某些内容抽象到一个更加整洁,基于注释的接口中。我还使用Jackson进行自动(反序列化)。
我也使用nginx,但是我不确定那是否是我想要进行减压的地方。Nginx节点仅平衡请求,然后通过数据中心分发这些请求。保持压缩,直到它真正到达要处理的节点,这将是同样好的。
提前致谢,
约翰
编辑:
我和@DaSourcerer之间的讨论对撰写本文时对事物状态感到好奇的人真的很有帮助。
我最终实现了自己的解决方案。请注意,这指定了分支“ ohmage-3.0”,但是它将很快合并到master分支中。您可能要检查那里以查看我是否进行了任何更新/修复。