我应该在服务层中记录CRUD方法吗



我开始将记录自定义异常的slf4j添加到我的项目中。我将日志添加到我的ServiceImplementation类中,在那里我有CRUD方法,我在DaoImplementation中实现了这些方法。问题是:如果我的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相关的问题,而是一个编码实践问题。你可能会从你问的每个人那里得到不同的答案,因为这可能与社区/公司/个人偏好等中制定的标准有关,因此:不要期望得到一个答案。

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

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

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

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

BTW-重新引发异常的规则:始终在抛出的新异常中嵌入cause异常,这样您将看到完整的异常链。

最新更新