讲解Log4j等日志工具应用的文章很多, 但是如何打好日志,什么时候打什么日志确实更高深的学问。
好的运行日志可以有效帮助问题定位,提高工作效率。
典型的不好的日志
日志泛滥:日志太多导致有用信息淹没其中
日志过少:不能帮助问题的定位,典型的就是异常路径没有记录日志
缺少信息:虽然记录了日志,描述含糊或没有加上必要的定位信息;如"Can't add role", 没有记录失败原因。
级别错误:这个问题没有上面几个严重,但是会造成工作效率下降。
日志一般分为5 个级别如下表:
级别名称 | 级别定义 |
debug ( 调试) | 函数的入口,记录函数调用关系。 |
info (信息) | 业务正常处理流程,记录业务流程。 |
warn (警告) | 非期望的分支,但不会造成大的影响。 |
error (错误) | 非期望的分支,会导致系统部分功能的不能工作。 |
fatal (致命) | 非期望的分支,会导致整个系统功能异常。 |
/**
* @param role 新增角色
* @return 新增角色的ID,null表示新增不成功
* @throws RoleCountLimitException 角色个数达规格异常
* @throws RoleNameConflictException 角色名称和已存在的角色冲突异常
* @throws RoleAclException 自定义角色不能有角色管理权限异常
*/
public Integer addRole(Role role)
throws RoleCountLimitException, RoleNameConflictException, RoleAclException
{
log.debug("Enter function addRole");
if (role == null ||
role.isSystemDefault() ||
role.getName() == null ||
role.getName().length() == 0)
{
log.warn("Can't add role for error input");
return null;
}
// 角色个数达最大值
if (roleDao.getRoleCount() >= MAX_ROLE_COUNT)
{
log.info("Can't add role for Role count reach it's limit");
throw new RoleCountLimitException();
}
RoleResource resource = resourceDAO.getRoleResource(role.getName());
if (resource != null)
{
log.info("Can't add role for RoleName conflict with system defalut role");
throw new RoleNameConflictException();
}
Role existRole = roleDao.getRole(role.getName());
if (existRole != null)
{
log.info("Can't add role for RoleName conflict with other role");
throw new RoleNameConflictException();
}
// 自定义角色不能有角色管理权限
if ((role.getAcl() & Role.ROLE_MANAGE) !=0)
{
log.warn("Can't add role with ROLE_MANAGE in acl");
throw new RoleAclException();
}
return roleDao.save(role);
}