微服务的集中式日志包装器

时间:2019-03-10 06:03:47

标签: java spring-boot logging error-handling microservices

我有spring boot microservices,我使用sl4j logger工厂,在每个服务中,我都记录如下消息:

异常期间的LOG错误:

LOG.error("service:{};msg:{};ex:{}", serviceName, msg, ex.getMessage(), ex);

验证期间出现LOG错误:

LOG.error("service:{};msg:{}", serviceName, msg);

日志信息:

LOG.info("service:{};event:{};msg:{}", service, event, message);

这在我所有的微服务中都很常见,是否使用包装器将这些日志消息集中化?还是将包装器放在单独的Maven应用程序中,并将依赖项添加为jar?

我想知道最好的设计是什么,代码片段会有所帮助。

1 个答案:

答案 0 :(得分:2)

通常,将关注点,领域逻辑与基础架构分开是一个好主意。

例如,如果您将服务部署为AWS Lambda,则可以将其视为一种部署。

然后,您应该创建一个单独的Maven模块,仅在其中放置Lambda处理程序的代码。此外,您可以具有一个用于Azure功能或Spring Boot应用程序的模块。您可以在Spring Context的帮助下将它们粘合在一起。

因此,您的日志记录将成为部署模块的一部分,因为域对“服务”一无所知。

如果错误处理很复杂,则可以为其创建一个lib模块。

AWS Lambda示例:

User = require('./models/user');
Cars = require('./models/cars');
Orders = require('./models/orders');

app.get('/userInfo', function(req, res) {
  let outPut = {}

  /*
   * Get data from MongoDB
   */

  // A
  User.countUsers()
    .then(count => {
      outPut.coutUsers = count;

      // B
      return Cars.countCars();
    })
    .then(count => {
      outPut.coutCars = count;

      // C
      return Orders.countOrders();
    })
    .then(count => {
      outPut.coutOrders = count;

      // Finally return a response
      res.status(200);
      res.json(outPut);
    })
    .catch(err => {
      // Catch errors in between the chains
      // Return server error (Depends on your way)
      res.status(500);
    })
});