我尝试在REST客户端中使用log4j并记录信息。但是,我尝试使用log4j记录事件服务器端,并且它不记录任何日志。这是我在服务器端使用的示例。
@POST
@Path("/send")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response consumeJSON(String str) throws Exception {
AmazonKinesisRecordProducerSample.init();
try {
pushData(str);
LOG.info(str)
} catch (IOException e) {
e.printStackTrace();
LOG.info(""+e);
return Response.status(400).entity(e).build();
}
return Response.status(200).entity(d).build();
}
这是我的客户端代码。这会捕获日志。
public class JerseyClient {
private static final Logger LOG = Logger.getLogger(JerseyClient.class);
static Date date = new Date();
public static void main(String[] args) {
try {
int i = 0;
long createTime = System.currentTimeMillis();
System.out.println("Server Response");
for (i = 0; i < 1000; i++) {
Details d = new Details();
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(
JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(clientConfig);
WebResource webResource = client
.resource("http://localhost:8080/JerseyJSON/rest/jsonServices/send");
ClientResponse response = webResource.accept("application/json")
.type("application/json").post(ClientResponse.class, d);
if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
}
String output = response.getEntity(String.class);
LOG.info(output + " inserted at-%d " + createTime);
System.out.println(output);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这将捕获我的项目根目录下的TestLog.log中的日志。但是,我的服务器端代码是POST
方法,它在Tomcat上运行并不捕获日志。
这是我的log4j.xml供参考。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{HH:mm:ss} [%t] %c{1} - %m%n" />
</layout>
</appender>
<appender name="ROLL" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="Testlog.log" />
<param name="Append" value="true" />
<param name="Encoding" value="UTF-8" />
<param name="MaxFileSize" value="10MB" />
<param name="MaxBackupIndex" value="2" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern"
value="%d{yyyy-MM-dd HH:mm:ss,SSSZ} %-5r %-5p [%c{1}] (%t:%x) %m%n" />
</layout>
</appender>
<category name="com.java" additivity="false">
<priority value="DEBUG"/>
<priority value="INFO" />
<appender-ref ref="ROLL"/>
<appender-ref ref="CONSOLE"/>
</category>
<root>
<priority value="INFO" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="ROLL"/>
</root>
答案 0 :(得分:1)
请参阅the documentation on how to do an helloWorld
看来你正在混合几个Log包。一定要使用Log4J而不是Java Logger。他们有不同的语法。
然后,在您的代码中,我看到了几个问题。在您的尝试中,您正在调用Logger的新实例,getLogger
不是日志记录方法。在catch块中,不要使用"" + e
来记录异常,使用库能力记录所有异常对象,包括message和stackTrace。
编辑:
最后我们找到了答案。有两个项目:客户端有一个主服务器,服务器端有REST服务,两个都有一个日志配置。问题是客户端登录本地目录,而服务器端登录Tomcat目录。
答案 1 :(得分:1)
您可能遗失在类路径中包含log4j.properties
或log4j.xml
。
答案 2 :(得分:0)
Maven依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
控制器类
@RestController
@RequestMapping(value = "/userinfo")
public class UserController {
@Autowired
private UserService userService;
private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);
// get all userinfo
@GetMapping(value = "/alluser", produces = MediaType.APPLICATION_JSON_VALUE)
public List<UserDto> getUserinfo() {
LOGGER.info("inside class!!!! UserController, method!!!: getUserinfo");
return userService.getAllUserInfo();
}
// get user info by id
@GetMapping(value = "/{userId}", produces = MediaType.APPLICATION_JSON_VALUE)
public UserDto getUserById(@PathVariable("userId") String userId) {
LOGGER.info("inside method!!!: getUserById", userId);
return userService.getUserByUserId(userId);
}
}
对于所有Java代码和参考,请使用以下链接: