无法关闭JposLogger的文件

时间:2019-07-03 06:40:58

标签: java jpos

我正在使用jpos 2.1.0并使用JposLogger生成和旋转iso日志。但是,由于无法根据日期来旋转日志,因此我无法正确配置参数,也无法关闭打开的日志文件。

这与上一期Too many files open

有关

我认为这是由于使用通用包装程序引起的,但深入研究时,这是由于JposLogger生成的文件关闭不当所致,可以使用centos中的lsof -p命令来识别该文件。一个请求生成一个文件。

[cipsappcen@connectipsappcen local]$ lsof -p 12108 |grep iso.log
java    12108 cipsappcen   36w      REG              253,2     58589 405618549 /u03/connectIPSSRVC/log/iso.log
java    12108 cipsappcen   47w      REG              253,2     58589 405618549 /u03/connectIPSSRVC/log/iso.log

public class Iso8583MessageBOKImpl implements Iso8583Message{
JposLogger logger = new JposLogger(isoLogLocation);
        org.jpos.iso.ISOPackager customPackager = new GenericPackager(isoPackagerLocation+iso8583Properties.getPackager());
        BaseChannel channel = new ASCIIChannel(iso8583Properties.getServerIp(), Integer.parseInt(iso8583Properties.getServerPort()), customPackager);// live
        logger.jposlogconfig(channel);
...
}

public void jposlogconfig(ISOChannel channel){
        try{
            //Configuring Logger   
            Logger logger = new Logger();
            logger.setName("Q2");
            org.jpos.util.DailyLogListener dayLog = new org.jpos.util.DailyLogListener();
            ProtectedLogListener pll = new ProtectedLogListener();
            Configuration protectLogCfg = new SimpleConfiguration();
            protectLogCfg.put("protect", "2");
            pll.setConfiguration(protectLogCfg);
            logger.addListener(pll);

            Configuration dayLogCfg = new SimpleConfiguration();
            dayLogCfg.put("window", "86400");
            dayLogCfg.put("prefix", logLocation);
            dayLogCfg.put("suffix", ".log");  
            dayLogCfg.put("date-format", "-yyyy-MM-dd");
            dayLog.setConfiguration(dayLogCfg);   
            logger.addListener(dayLog);
            logger.addListener(new SimpleLogListener(System.out)); 
            ((LogSource)channel).setLogger(logger, "connectips-channel");

            logger.removeListener(pll);
        }catch(Exception ex){
            System.out.println(ex);
        }
    }

由于文件未正确关闭,操作系统无法处理太多打开的文件。

1 个答案:

答案 0 :(得分:1)

您只需在应用程序中实例化一次记录器和日志侦听器。

一种选择是使用Logger.getLogger()注册并创建记录器。

首先,您只需在应用程序中创建一次记录器即可,例如使用这种方法

public void initLogger() {
    Logger logger = Logger.getLogger("Q2"); //this creates a logger and register it with Q2 name
    org.jpos.util.DailyLogListener dayLog = new org.jpos.util.DailyLogListener();
    ProtectedLogListener pll = new ProtectedLogListener();
    Configuration protectLogCfg = new SimpleConfiguration();
    protectLogCfg.put("protect", "2");
    pll.setConfiguration(protectLogCfg);
    logger.addListener(pll);

    Configuration dayLogCfg = new SimpleConfiguration();
    dayLogCfg.put("window", "86400");
    dayLogCfg.put("prefix", logLocation);
    dayLogCfg.put("suffix", ".log");  
    dayLogCfg.put("date-format", "-yyyy-MM-dd");
    dayLog.setConfiguration(dayLogCfg);   
    logger.addListener(dayLog);
    logger.addListener(new SimpleLogListener(System.out)); 
    //all set now logger is accessible via Logger.getLogger
}

然后,当您创建新频道时,只需设置先前创建的记录器即可:

public class Iso8583MessageBOKImpl implements Iso8583Message{
...
        org.jpos.iso.ISOPackager customPackager = new GenericPackager(isoPackagerLocation+iso8583Properties.getPackager());
        BaseChannel channel = new ASCIIChannel(iso8583Properties.getServerIp(), Integer.parseInt(iso8583Properties.getServerPort()), customPackager);// live
        channel.setLogger(Logger.getLogger("Q2"),"connectips-channel");
...
}

如果以前没有使用该名称注册的记录器,则内部Logger.getLogger(String name)将创建一个新的记录器,并将其注册到NameRegistrar

具有相同名称的成功呼叫将返回先前创建的呼叫。这样,您只创建一次文件。

最重要的是,initLogger仅在应用程序的开头被调用,例如(如果不是唯一的话,则在类的静态初始值设定项中这不是最好的例子)使用jpos相关类的地方:

public class Iso8583MessageBOKImpl implements Iso8583Message{

    static {
        initLogger();
    }
...

最后但并非最不重要的是,我强烈建议您使用Q2初始化jpos对象,this tutorial具有创建通道和记录器的全部功能。

然后,当您要发送消息时,甚至不需要实例化通道,只需调用QMUX.getMUX(mux-name)QMUX.request()方法即可向通道发送消息并接收其响应。