Java 在Jboss webservice中使用Log4j时写入重复数据

Java 在Jboss webservice中使用Log4j时写入重复数据,java,web-services,logging,jboss,ejb,Java,Web Services,Logging,Jboss,Ejb,我将Log4j与jbossejbwebservice一起使用。我正在文件中记录应用程序流 这是我用来记录日志的代码 FileAppender fileappender; File file = new File("jws_" + getCurrentDate("dd_MMM_yyyy") + ".log"); Logger log = null; System.out.println(file.getAbsolutePath() ); try

我将Log4j与jbossejbwebservice一起使用。我正在文件中记录应用程序流

这是我用来记录日志的代码

 FileAppender fileappender;

    File file = new File("jws_" + getCurrentDate("dd_MMM_yyyy") + ".log");

            Logger log = null;
    System.out.println(file.getAbsolutePath() );
    try
    {
        log = Logger.getLogger(ConnMan.class);
        fileappender = new FileAppender(new PatternLayout(),"f2cjws_" + getCurrentDate("dd_MMM_yyyy") + ".log");
        log.addAppender(fileappender);


                    if (!theLogLevel.equalsIgnoreCase("error"))
                    {
                        if ("yes".equalsIgnoreCase(getProperties().getProperty("log")))
                        {
                            log.debug(getCurrentDate("dd MMM yyyy HH:mm:ss 1")+" "+theError);
                        }
                    }
                    else
                    {
                        log.debug(getCurrentDate("dd MMM yyyy HH:mm:ss 1")+" "+theError);
                    }

    }
    catch (IOException e)
    {
        System.out.println("Logger failed due to "+e.getMessage());
    }
    catch(Exception e)
    {
        System.out.println("Logger failed due to "+e.getMessage());
    }
当我运行应用程序时,我在文件中得到了重复的数据,也就是说,相同的数据被写入两到三次。上述代码在部署在tomcat中的webapplication中运行良好

所以我觉得我在JBoss的相关方面遗漏了一些东西

此Web服务目前使用服务器内置的log4j属性。我可以知道如何使用应用程序自己的属性文件吗

请帮帮我


提前感谢,

您需要创建自己的日志编写器

public final class LogWriter
{

    private static Logger appLogger = null;

    private static String className = LogWriter.class.getName() + ".";

    static
    {
        try
        {
            appLogger = Logger.getLogger("Demologer");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public static void logDebug(String message)
    {
        appLogger.log(className, Level.DEBUG, LogWriter.getMessage(message), null);
    }


    public static void logInfo(String message)
    {
        appLogger.log(className, Level.INFO, LogWriter.getMessage(message), null);
    }

    public static void logError(String message)
    {
        appLogger.log(className, Level.ERROR, LogWriter.getMessage(message), null);
    }

    private static String getMessage(String message)
    {
        String retValue;

        Calendar cale = Calendar.getInstance();
        Date now = cale.getTime();

        //retValue=now.getDate()+"/"+(now.getMonth()+1)+"/"+(now.getYear()+1900)+"  "+now.getHours()+":"+now.getMinutes()+":"+now.getSeconds();
        retValue = now + "\n";

        now = null;
        cale = null;

        return retValue + message;
    }
}


您可以根据需要使用此日志编写器。

您需要创建自己的日志编写器

public final class LogWriter
{

    private static Logger appLogger = null;

    private static String className = LogWriter.class.getName() + ".";

    static
    {
        try
        {
            appLogger = Logger.getLogger("Demologer");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public static void logDebug(String message)
    {
        appLogger.log(className, Level.DEBUG, LogWriter.getMessage(message), null);
    }


    public static void logInfo(String message)
    {
        appLogger.log(className, Level.INFO, LogWriter.getMessage(message), null);
    }

    public static void logError(String message)
    {
        appLogger.log(className, Level.ERROR, LogWriter.getMessage(message), null);
    }

    private static String getMessage(String message)
    {
        String retValue;

        Calendar cale = Calendar.getInstance();
        Date now = cale.getTime();

        //retValue=now.getDate()+"/"+(now.getMonth()+1)+"/"+(now.getYear()+1900)+"  "+now.getHours()+":"+now.getMinutes()+":"+now.getSeconds();
        retValue = now + "\n";

        now = null;
        cale = null;

        return retValue + message;
    }
}


您可以根据需要使用此属性。

如果您的log4j.properties中有以下内容,您将在输出中看到重复:

log4j.rootLogger=error, myappender
log4j.logger.com.sample=warn, myappender 
log4j.logger.com.sample.deeper.package=all, myappender 
将其更正为:

log4j.rootLogger=error, myappender
log4j.logger.com.sample=warn 
log4j.logger.com.sample.deeper.package=all
编辑:

下面将从每个类中写入致命和错误级别日志,从com.sample.*类中写入致命、错误和警告级别日志,从com.sample.deepher.package.*类中写入每个日志到/var/log/myappender/myappender.log文件

在根包中另存为log4j.properties:

# This appender is not used in this example.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c - %m%n

# But this one is used.
log4j.appender.myappender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.myappender.DatePattern='.'yyyy-MM-dd
log4j.appender.myappender.File=/var/log/myappender/myappender.log
log4j.appender.myappender.layout=org.apache.log4j.PatternLayout
log4j.appender.myappender.layout.ConversionPattern=%d{ABSOLUTE} %5p %c - %m%n
log4j.appender.myappender.Encoding=UTF-8

log4j.rootLogger=error, myappender
log4j.logger.com.sample=warn 
log4j.logger.com.sample.deeper.package=all
在每个类中,您都需要一个记录器:

    private static Logger logger = Logger.getLogger(ThisClassName.class);

而且您不再需要问题中的代码片段了。

如果您的log4j.properties中有以下类似内容,您将在输出中看到重复:

log4j.rootLogger=error, myappender
log4j.logger.com.sample=warn, myappender 
log4j.logger.com.sample.deeper.package=all, myappender 
将其更正为:

log4j.rootLogger=error, myappender
log4j.logger.com.sample=warn 
log4j.logger.com.sample.deeper.package=all
编辑:

下面将从每个类中写入致命和错误级别日志,从com.sample.*类中写入致命、错误和警告级别日志,从com.sample.deepher.package.*类中写入每个日志到/var/log/myappender/myappender.log文件

在根包中另存为log4j.properties:

# This appender is not used in this example.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c - %m%n

# But this one is used.
log4j.appender.myappender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.myappender.DatePattern='.'yyyy-MM-dd
log4j.appender.myappender.File=/var/log/myappender/myappender.log
log4j.appender.myappender.layout=org.apache.log4j.PatternLayout
log4j.appender.myappender.layout.ConversionPattern=%d{ABSOLUTE} %5p %c - %m%n
log4j.appender.myappender.Encoding=UTF-8

log4j.rootLogger=error, myappender
log4j.logger.com.sample=warn 
log4j.logger.com.sample.deeper.package=all
在每个类中,您都需要一个记录器:

    private static Logger logger = Logger.getLogger(ThisClassName.class);


而且你不再需要你的问题中的代码片段了。

我是唯一一个看到完全随机缩进的人吗?我觉得我在这里吃疯狂的药片对不起,我没法给你吃。你能说得更具体些吗?谢谢我认为你走错了路……@水是的,我也有同感。你能纠正我或提供任何其他解决方案吗?为什么不使用默认的追加器?我是唯一一个看到完全随机缩进的人吗?我觉得我在这里吃疯狂的药片对不起,我没法给你吃。你能说得更具体些吗?谢谢我认为你走错了路……@水是的,我也有同感。你能纠正我或提供任何其他解决方案吗?为什么不使用默认的附加器?哦,你可以编辑第一个来更新你的答案。感谢更新您的解决方案有效。只有一个疑问。这是一个流量很大的Web服务。创建静态方法会导致任何问题吗?哦,你可以编辑第一个来更新你的答案。感谢更新您的解决方案有效。只有一个疑问。这是一个流量很大的Web服务。创建静态方法会导致任何问题吗?实际上,我的Web服务采用Jboss中提供的默认log4j属性文件。你能告诉我如何让它看起来像我的属性吗?据我记忆所及,加载属性文件遵循在Java类路径中加载其他类型的资源,因此类路径中的属性文件将覆盖JAR中相同包中的所有其他属性文件。我将在回复中添加一个示例,请稍等!更新!!(+More chars to feed StackOverflow!!)实际上,我的Web服务采用Jboss中提供的默认log4j属性文件。你能告诉我如何让它看起来像我的属性吗?据我记忆所及,加载属性文件遵循在Java类路径中加载其他类型的资源,因此类路径中的属性文件将覆盖JAR中相同包中的所有其他属性文件。我将在回复中添加一个示例,请稍等!更新!!(+更多字符要输入StackOverflow!!)