【问题标题】:Should I log CRUD methods in Service layer?我应该在服务层中记录 CRUD 方法吗?
【发布时间】:2022-01-05 19:24:51
【问题描述】:

我开始添加 slf4j,将自定义异常记录到我的项目中。我将日志添加到我的 ServiceImplementation 类中,其中有我在 DaoImplementation 类中实现的 CRUD 方法。问题是:如果我的 CRUD 方法已经在 Dao 类中添加了日志和自定义异常,它们是否应该在其他类中具有相同的日志? 示例:

public class SpringTeacherDao implements TeacherDao {
private static Logger logger = LoggerFactory.getLogger(SpringTeacherDao.class);

private JdbcTemplate jdbcTemplate;


@Autowired
public SpringTeacherDao(DataSource dataSource) {
    jdbcTemplate = new JdbcTemplate(dataSource);
}

@Override
public void create(Teacher teacher) {
    logger.debug("Add teacher status: in progress...");
    if (teacher == null) {
        String error = "Add teacher status: Error, teacher is null.";
        logger.warn(error);
        throw new UniversityDaoException(error);
    }
    String sql = "INSERT INTO teacher VALUES(?,?,?)";
    try {
        jdbcTemplate.update(sql, teacher.getID(), teacher.getName(), teacher.getSurname());
    }catch (DuplicateKeyException e){
        String duplicate = "Teacher id already exist";
        logger.warn(duplicate);
        throw new UniversityDaoException(duplicate);
    }
    logger.info("Add teacher status: Teacher has been added");
}
public class TeacherServiceImpl implements TeacherService {
private static Logger logger = LoggerFactory.getLogger(TeacherServiceImpl.class);
private final TeacherDao teacherDao;
private final LectureDao lectureDao;
private final TeachersLectureDao teachersLectureDao;


public TeacherServiceImpl(TeacherDao teacherDao, LectureDao lectureDao, TeachersLectureDao teachersLectureDao) {
    this.teacherDao = teacherDao;
    this.lectureDao = lectureDao;
    this.teachersLectureDao = teachersLectureDao;
}

@Override
public void addTeacher(Teacher teacher) {
    teacherDao.create(teacher);
}

【问题讨论】:

    标签: java exception logging


    【解决方案1】:

    这不是与 java 相关的问题,而是编码实践问题。您可能会从您询问的每个人那里得到不同的答案,因为这可能与社区/公司/个人偏好等建立的标准有关,因此:不要期望一个单一的答案。

    我对这个主题的看法(只是在多个层上记录异常,我不是在谈论传播/重新抛出/包装异常 - 因为那是另一个故事)如下:

    如果给定层有任何特定的内容要添加到日志中:记录它。 例如:

    • DAO 层可能会记录与异常的 DB 故障相关的信息
    • 服务层(调用该 DAO)可能有更多执行该操作的上下文(即某些用户 ID 或操作特定数据),可能会记录异常。
    • 可能有更多层,即下一层可能是某个控制器,它可以记录一些请求标识符(用于跟踪目的)或请求数据。

    当然会导致异常被记录 3 次,每次都会向日志中添加更多数据。但是,当您编写 DAO 类时,您无法保证服务是否会记录异常,因此它应该始终记录它(除非您有一个全局异常处理程序来记录所有未捕获的异常 - 但是:您无法保证服务不只是在没有记录的情况下捕获异常)

    顺便说一句 - 重新抛出异常的规则:始终在您抛出的新异常中嵌入 cause 异常,这样您将看到完整的异常链。

    【讨论】:

      猜你喜欢
      • 2011-09-19
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 2011-02-11
      • 1970-01-01
      • 2012-01-04
      • 2014-09-11
      相关资源
      最近更新 更多