java开发怎么做日志功能 就是记录用户每一步的操作具体做什么了

时间:2022-02-28 22:10:33
java开发怎么做日志功能 就是记录用户每一步的操作具体做什么了
 并且能查询用户的操作动作
要怎么做?Java怎么写?

35 个解决方案

#1


写数据库写文件

你是不会写数据库还是不会写文件?

#2


引用 1 楼 ygycomon 的回复:
写数据库写文件

你是不会写数据库还是不会写文件?

都不会,我是才进公司做开发的,之前一直没做过这个 java开发怎么做日志功能 就是记录用户每一步的操作具体做什么了

#3


spring aop

#4


引用 3 楼 meiwenhui 的回复:
spring aop

我做的这个暂时还没用到框架,这个日志功能怎么写啊,我没写过,求源码

#5


数据插入难道不会吗。 java开发怎么做日志功能 就是记录用户每一步的操作具体做什么了

#6


引用 5 楼 JAVA_LiuTe 的回复:
数据插入难道不会吗。 java开发怎么做日志功能 就是记录用户每一步的操作具体做什么了

这个会,但是那个日志功能的Java源码怎么写啊,这个不会,没写过

#7


引用 3 楼 meiwenhui 的回复:
spring aop

Spring AOP只能对Factory里取得的Bean的第一层方法有用,不能记录每一步的日志。
class CA {
public void foo() {
    bar();
}

public void bar() {
}
}

例如: 
CA ca = SpringFactory.getBean("BeanName", CA.class);
ca.foo()
Spring只能对foo做切面,不能对bar()做切面。
ca.bar() 能做bar() 做切面。

即使Spring AOP不能作用于类方法的嵌套调用。

#8


设计好表格 。。 重要的操作之后统一掉写好的插入日志方法呗。。

#9


求一个通用的日志记录Java源码

#10


log4j吧,不过每一步都要你自己记录

#11


用 spring aop 设置访问所有类的
都配置进去
然后调用 log4j
把用户信息以及调用类的名称,方法记录进去
写入日志文件

#12


引用 10 楼 longtian1213 的回复:
log4j吧,不过每一步都要你自己记录

那怎么用log4j的日志记录功能啊,我是要把记录的操作日志信息保存到数据库的,数据库用的是SQL Server2008

#13


我想自己写一个通用的log类,里面有添加日志的静态方法(就是写插入一条记录到日志表),以后想添加一条日志的时候就直接调用该方法,这是我的思路,但是我没写过,不知道怎么写和调用,求源码

#14


引用 12 楼 u012521676 的回复:
Quote: 引用 10 楼 longtian1213 的回复:

log4j吧,不过每一步都要你自己记录

那怎么用log4j的日志记录功能啊,我是要把记录的操作日志信息保存到数据库的,数据库用的是SQL Server2008

Log4j写入数据库详解

#15


引用 14 楼 longtian1213 的回复:
Quote: 引用 12 楼 u012521676 的回复:

Quote: 引用 10 楼 longtian1213 的回复:

log4j吧,不过每一步都要你自己记录

那怎么用log4j的日志记录功能啊,我是要把记录的操作日志信息保存到数据库的,数据库用的是SQL Server2008

Log4j写入数据库详解

这个我试过了,是能用,日志信息在控制台打印出来了,但是数据库中没有记录,我想知道是什么原因

#16


自己写的话 在你的底层方法中调用记录日志的公用方法即可

#17


写个过滤器 把每次操作的请求名,时间,操作人入库

#18


log4j配置好后,但是日志不能够输出到数据库中,数据库表中还是没有数据记录
我的配置如下:
log4j.properties log4j.rootLogger=INFO,stdout
log4j.logger.org.springframework.web.servlet=INFO,db
log4j.logger.org.springframework.beans.factory.xml=INFO
log4j.logger.com.neam.stum.user=INFO,db
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] - - <%m>%n
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/exppower.log
log4j.appender.logfile.DatePattern=.yyyy-MM-dd log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] wang- <%m>%n
########################
# JDBC Appender
#######################
#log4j.logger.business=INFO,db
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.BufferSize=1
log4j.appender.db.sqlname=log
log4j.appender.db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
log4j.appender.db.URL=jdbc:jtds:SqlServer://192.168.12.2:1433;DatabaseName=boxserver
log4j.appender.db.user=sa
log4j.appender.db.password=123456
log4j.appender.db.sql=insert into WDZLOG (LogName,UserName,createTime,LogLevel,MSG) values ('%X{id}','%X{username}','%d{yyyy-MM-dd HH:mm:ss}','%p','%m')
log4j.appender.db.layout=org.apache.log4j.PatternLayout

#19


我那个我自己找出原因了,日志信息可以保存到数据库了,但是不知道为什么,没有用户名称,
这是我的数据库表创建SQL语句:
CREATE TABLE [dbo].[WDZLOG] (  
    WDZLOGID int IDENTITY (1, 1) NOT NULL ,  
    UserName varchar(255) COLLATE Chinese_PRC_CI_AS NULL ,--用户名称
    CreateTime varchar(255) COLLATE Chinese_PRC_CI_AS NULL ,--产生时间  
    LogLevel varchar(20) COLLATE Chinese_PRC_CI_AS NULL ,--日志级别
    MSG varchar(555) COLLATE Chinese_PRC_CI_AS NULL --日志信息
) ON [PRIMARY]  
GO
现在是其他的都有数据,就是用户没有 ,现在是怎么得到当前登录的用户名

#20


建议定一个注解,将需要记录日志的地方通过注解表示,并且配置当前操作相关信息,比如:新增用户,删除用户,更新用户。
然后做一个拦截器或者AOP,读取拦截方法的日志注解,并且读取配置的注解信息,如果你要记录请求的详细信息,可以把所有的请求参数都保存到数据库,为了确保日志记录不印象正常的业务流程或者执行效率,可以考虑采取异步执行的方式(具体可以看看jdk的Executor),这样就可以在不印象正常业务的情况下记录日志。

#21


有这样的设计思想,
              1、在前端设计开发人员可以调用的日志存储方法,比如用户新增就开发人员调用设定好的方法进行保存;
              2、在后端可以在Action层中设定父类,该父类有add方法,设计beforeAdd和afterAdd在beforeAdd方法中添加日志;
              3、使用aop技术,当然比较高端

#22


谢谢各位!我的搞定了,我用的是log4j的,日志信息可以保存到数据库,但是现在有个问题,我测试用户登录记录,但是在数据库中用户名保存的却不是登录的用户名,这是为什么,帮忙看一下,谢谢!
这是我的拦截器代码:
private final static double DEFAULT_USERID= Math.random()*100000.0;
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpSession session= req.getSession();
if (session==null){
MDC.put("username",DEFAULT_USERID);  
}
else{
String username= (String)session.getAttribute("user");
if (username==null){
MDC.put("username",DEFAULT_USERID);
} else {
MDC.put("username",username);
}
}
System.out.println(MDC.get("username"));
//logger.info("test for MDC.");
chain.doFilter(request, response);
}

#23


session丢失了 在每一个用到session的地方都保存一次用户session就OK了

#24


引用 23 楼 qq_19616287 的回复:
session丢失了 在每一个用到session的地方都保存一次用户session就OK了

现在的问题是程序第一遍运行,我用wing登录进去了,但是数据库表中保存的登录用户名却是一个随机数,而不是wing
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpSession session= req.getSession();
if (session==null){
MDC.put("username",DEFAULT_USERID);  
}
else{
UserVO user=(UserVO)session.getAttribute("user");
if (user != null){
MDC.put("username",user.getUsername());
} else {
MDC.put("username",DEFAULT_USERID);
}
}
//logger.info("test for MDC.");
System.out.println(MDC.get("username"));
chain.doFilter(request, response);
}
那个MDC的username的value没有更新就存到数据库了,

#25


前几天客户提过这个,是做大数据的。从登录到退出,当时构思的是写进数据库里。

#26


引用 25 楼 u010126977 的回复:
前几天客户提过这个,是做大数据的。从登录到退出,当时构思的是写进数据库里。

然后呢?你是怎么做的?

#27


我们以前公司是在每个需要记录的方法前面加个注解,注解的定义也是自己写的,其实也就是使用Spring AOP来实现的

#28


看需要记录的行为细化到什么程度  如果仅仅记录哪些用户 什么时间做了什么事 出现什么异常   写个拦截器即可
如果还要记录行为的具体执行过程  这个只能靠log4j了   比较麻烦  也得设计

#29


引用 26 楼 u012521676 的回复:
Quote: 引用 25 楼 u010126977 的回复:

前几天客户提过这个,是做大数据的。从登录到退出,当时构思的是写进数据库里。

然后呢?你是怎么做的?

这个我没有参与……我进了另一个项目组……

#30


引用 29 楼 u010126977 的回复:
Quote: 引用 26 楼 u012521676 的回复:

Quote: 引用 25 楼 u010126977 的回复:

前几天客户提过这个,是做大数据的。从登录到退出,当时构思的是写进数据库里。

然后呢?你是怎么做的?

这个我没有参与……我进了另一个项目组……

好吧,虽然没有我想要的,不过还是谢谢你

#31


因为你登陆的时候,登陆之前,就先拦截了登陆请求,这时候你还没有登陆成功,session里面的username还是null,所以这时候会执行“MDC.put("username",DEFAULT_USERID)”,执行完了才会接着进入登陆方法,然后才是登陆成功。
解决办法:拦截的时候判断一下,如果是登陆请求,则不拦截。

#32


怎么DEBUG啊,新手求指教

#33


引用 20 楼 JDream314 的回复:
建议定一个注解,将需要记录日志的地方通过注解表示,并且配置当前操作相关信息,比如:新增用户,删除用户,更新用户。
然后做一个拦截器或者AOP,读取拦截方法的日志注解,并且读取配置的注解信息,如果你要记录请求的详细信息,可以把所有的请求参数都保存到数据库,为了确保日志记录不印象正常的业务流程或者执行效率,可以考虑采取异步执行的方式(具体可以看看jdk的Executor),这样就可以在不印象正常业务的情况下记录日志。

请问有这个异步执行与aop相结合的demo嘛?

#34


楼主,你加表字段了没?你之前不是没有用户id么,你加了没有?

#35


怎么写的啊?教教我啊,技术大牛

#1


写数据库写文件

你是不会写数据库还是不会写文件?

#2


引用 1 楼 ygycomon 的回复:
写数据库写文件

你是不会写数据库还是不会写文件?

都不会,我是才进公司做开发的,之前一直没做过这个 java开发怎么做日志功能 就是记录用户每一步的操作具体做什么了

#3


spring aop

#4


引用 3 楼 meiwenhui 的回复:
spring aop

我做的这个暂时还没用到框架,这个日志功能怎么写啊,我没写过,求源码

#5


数据插入难道不会吗。 java开发怎么做日志功能 就是记录用户每一步的操作具体做什么了

#6


引用 5 楼 JAVA_LiuTe 的回复:
数据插入难道不会吗。 java开发怎么做日志功能 就是记录用户每一步的操作具体做什么了

这个会,但是那个日志功能的Java源码怎么写啊,这个不会,没写过

#7


引用 3 楼 meiwenhui 的回复:
spring aop

Spring AOP只能对Factory里取得的Bean的第一层方法有用,不能记录每一步的日志。
class CA {
public void foo() {
    bar();
}

public void bar() {
}
}

例如: 
CA ca = SpringFactory.getBean("BeanName", CA.class);
ca.foo()
Spring只能对foo做切面,不能对bar()做切面。
ca.bar() 能做bar() 做切面。

即使Spring AOP不能作用于类方法的嵌套调用。

#8


设计好表格 。。 重要的操作之后统一掉写好的插入日志方法呗。。

#9


求一个通用的日志记录Java源码

#10


log4j吧,不过每一步都要你自己记录

#11


用 spring aop 设置访问所有类的
都配置进去
然后调用 log4j
把用户信息以及调用类的名称,方法记录进去
写入日志文件

#12


引用 10 楼 longtian1213 的回复:
log4j吧,不过每一步都要你自己记录

那怎么用log4j的日志记录功能啊,我是要把记录的操作日志信息保存到数据库的,数据库用的是SQL Server2008

#13


我想自己写一个通用的log类,里面有添加日志的静态方法(就是写插入一条记录到日志表),以后想添加一条日志的时候就直接调用该方法,这是我的思路,但是我没写过,不知道怎么写和调用,求源码

#14


引用 12 楼 u012521676 的回复:
Quote: 引用 10 楼 longtian1213 的回复:

log4j吧,不过每一步都要你自己记录

那怎么用log4j的日志记录功能啊,我是要把记录的操作日志信息保存到数据库的,数据库用的是SQL Server2008

Log4j写入数据库详解

#15


引用 14 楼 longtian1213 的回复:
Quote: 引用 12 楼 u012521676 的回复:

Quote: 引用 10 楼 longtian1213 的回复:

log4j吧,不过每一步都要你自己记录

那怎么用log4j的日志记录功能啊,我是要把记录的操作日志信息保存到数据库的,数据库用的是SQL Server2008

Log4j写入数据库详解

这个我试过了,是能用,日志信息在控制台打印出来了,但是数据库中没有记录,我想知道是什么原因

#16


自己写的话 在你的底层方法中调用记录日志的公用方法即可

#17


写个过滤器 把每次操作的请求名,时间,操作人入库

#18


log4j配置好后,但是日志不能够输出到数据库中,数据库表中还是没有数据记录
我的配置如下:
log4j.properties log4j.rootLogger=INFO,stdout
log4j.logger.org.springframework.web.servlet=INFO,db
log4j.logger.org.springframework.beans.factory.xml=INFO
log4j.logger.com.neam.stum.user=INFO,db
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] - - <%m>%n
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/exppower.log
log4j.appender.logfile.DatePattern=.yyyy-MM-dd log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] wang- <%m>%n
########################
# JDBC Appender
#######################
#log4j.logger.business=INFO,db
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.BufferSize=1
log4j.appender.db.sqlname=log
log4j.appender.db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
log4j.appender.db.URL=jdbc:jtds:SqlServer://192.168.12.2:1433;DatabaseName=boxserver
log4j.appender.db.user=sa
log4j.appender.db.password=123456
log4j.appender.db.sql=insert into WDZLOG (LogName,UserName,createTime,LogLevel,MSG) values ('%X{id}','%X{username}','%d{yyyy-MM-dd HH:mm:ss}','%p','%m')
log4j.appender.db.layout=org.apache.log4j.PatternLayout

#19


我那个我自己找出原因了,日志信息可以保存到数据库了,但是不知道为什么,没有用户名称,
这是我的数据库表创建SQL语句:
CREATE TABLE [dbo].[WDZLOG] (  
    WDZLOGID int IDENTITY (1, 1) NOT NULL ,  
    UserName varchar(255) COLLATE Chinese_PRC_CI_AS NULL ,--用户名称
    CreateTime varchar(255) COLLATE Chinese_PRC_CI_AS NULL ,--产生时间  
    LogLevel varchar(20) COLLATE Chinese_PRC_CI_AS NULL ,--日志级别
    MSG varchar(555) COLLATE Chinese_PRC_CI_AS NULL --日志信息
) ON [PRIMARY]  
GO
现在是其他的都有数据,就是用户没有 ,现在是怎么得到当前登录的用户名

#20


建议定一个注解,将需要记录日志的地方通过注解表示,并且配置当前操作相关信息,比如:新增用户,删除用户,更新用户。
然后做一个拦截器或者AOP,读取拦截方法的日志注解,并且读取配置的注解信息,如果你要记录请求的详细信息,可以把所有的请求参数都保存到数据库,为了确保日志记录不印象正常的业务流程或者执行效率,可以考虑采取异步执行的方式(具体可以看看jdk的Executor),这样就可以在不印象正常业务的情况下记录日志。

#21


有这样的设计思想,
              1、在前端设计开发人员可以调用的日志存储方法,比如用户新增就开发人员调用设定好的方法进行保存;
              2、在后端可以在Action层中设定父类,该父类有add方法,设计beforeAdd和afterAdd在beforeAdd方法中添加日志;
              3、使用aop技术,当然比较高端

#22


谢谢各位!我的搞定了,我用的是log4j的,日志信息可以保存到数据库,但是现在有个问题,我测试用户登录记录,但是在数据库中用户名保存的却不是登录的用户名,这是为什么,帮忙看一下,谢谢!
这是我的拦截器代码:
private final static double DEFAULT_USERID= Math.random()*100000.0;
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpSession session= req.getSession();
if (session==null){
MDC.put("username",DEFAULT_USERID);  
}
else{
String username= (String)session.getAttribute("user");
if (username==null){
MDC.put("username",DEFAULT_USERID);
} else {
MDC.put("username",username);
}
}
System.out.println(MDC.get("username"));
//logger.info("test for MDC.");
chain.doFilter(request, response);
}

#23


session丢失了 在每一个用到session的地方都保存一次用户session就OK了

#24


引用 23 楼 qq_19616287 的回复:
session丢失了 在每一个用到session的地方都保存一次用户session就OK了

现在的问题是程序第一遍运行,我用wing登录进去了,但是数据库表中保存的登录用户名却是一个随机数,而不是wing
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpSession session= req.getSession();
if (session==null){
MDC.put("username",DEFAULT_USERID);  
}
else{
UserVO user=(UserVO)session.getAttribute("user");
if (user != null){
MDC.put("username",user.getUsername());
} else {
MDC.put("username",DEFAULT_USERID);
}
}
//logger.info("test for MDC.");
System.out.println(MDC.get("username"));
chain.doFilter(request, response);
}
那个MDC的username的value没有更新就存到数据库了,

#25


前几天客户提过这个,是做大数据的。从登录到退出,当时构思的是写进数据库里。

#26


引用 25 楼 u010126977 的回复:
前几天客户提过这个,是做大数据的。从登录到退出,当时构思的是写进数据库里。

然后呢?你是怎么做的?

#27


我们以前公司是在每个需要记录的方法前面加个注解,注解的定义也是自己写的,其实也就是使用Spring AOP来实现的

#28


看需要记录的行为细化到什么程度  如果仅仅记录哪些用户 什么时间做了什么事 出现什么异常   写个拦截器即可
如果还要记录行为的具体执行过程  这个只能靠log4j了   比较麻烦  也得设计

#29


引用 26 楼 u012521676 的回复:
Quote: 引用 25 楼 u010126977 的回复:

前几天客户提过这个,是做大数据的。从登录到退出,当时构思的是写进数据库里。

然后呢?你是怎么做的?

这个我没有参与……我进了另一个项目组……

#30


引用 29 楼 u010126977 的回复:
Quote: 引用 26 楼 u012521676 的回复:

Quote: 引用 25 楼 u010126977 的回复:

前几天客户提过这个,是做大数据的。从登录到退出,当时构思的是写进数据库里。

然后呢?你是怎么做的?

这个我没有参与……我进了另一个项目组……

好吧,虽然没有我想要的,不过还是谢谢你

#31


因为你登陆的时候,登陆之前,就先拦截了登陆请求,这时候你还没有登陆成功,session里面的username还是null,所以这时候会执行“MDC.put("username",DEFAULT_USERID)”,执行完了才会接着进入登陆方法,然后才是登陆成功。
解决办法:拦截的时候判断一下,如果是登陆请求,则不拦截。

#32


怎么DEBUG啊,新手求指教

#33


引用 20 楼 JDream314 的回复:
建议定一个注解,将需要记录日志的地方通过注解表示,并且配置当前操作相关信息,比如:新增用户,删除用户,更新用户。
然后做一个拦截器或者AOP,读取拦截方法的日志注解,并且读取配置的注解信息,如果你要记录请求的详细信息,可以把所有的请求参数都保存到数据库,为了确保日志记录不印象正常的业务流程或者执行效率,可以考虑采取异步执行的方式(具体可以看看jdk的Executor),这样就可以在不印象正常业务的情况下记录日志。

请问有这个异步执行与aop相结合的demo嘛?

#34


楼主,你加表字段了没?你之前不是没有用户id么,你加了没有?

#35


怎么写的啊?教教我啊,技术大牛