如何在REST服务中使用log4j

时间:2015-06-07 23:41:30

标签: java rest log4j

我尝试在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>

3 个答案:

答案 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.propertieslog4j.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代码和参考,请使用以下链接:

https://www.youtube.com/watch?v=n4X99F6ckhw&t=4s