无法关闭 JposLogger 的文件
Unable to close the files of JposLogger
我正在使用 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);
}
}
由于文件没有正确关闭OS无法处理打开的文件太多。
您只需在您的应用程序中实例化您的记录器和日志监听器一次。
一种选择是使用 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
中注册它
与之前创建的 return 同名的连续调用。这样您只创建一次文件。
这里最重要的是 initLogger
只在你的应用程序开始时被调用,例如(这不是最好的方法只是一个例子)在你的 class 如果那是你唯一使用 jpos 相关的地方 class:
public class Iso8583MessageBOKImpl implements Iso8583Message{
static {
initLogger();
}
...
最后但重要的是,我强烈建议您使用 Q2
来初始化 jpos 对象,this tutorial 拥有创建通道和记录器所需的一切。
然后当你想发送消息时,你甚至不需要实例化通道,只需调用 QMUX.getMUX(mux-name)
和 QMUX.request()
方法向通道发送消息并接收其响应。
我正在使用 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);
}
}
由于文件没有正确关闭OS无法处理打开的文件太多。
您只需在您的应用程序中实例化您的记录器和日志监听器一次。
一种选择是使用 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
与之前创建的 return 同名的连续调用。这样您只创建一次文件。
这里最重要的是 initLogger
只在你的应用程序开始时被调用,例如(这不是最好的方法只是一个例子)在你的 class 如果那是你唯一使用 jpos 相关的地方 class:
public class Iso8583MessageBOKImpl implements Iso8583Message{
static {
initLogger();
}
...
最后但重要的是,我强烈建议您使用 Q2
来初始化 jpos 对象,this tutorial 拥有创建通道和记录器所需的一切。
然后当你想发送消息时,你甚至不需要实例化通道,只需调用 QMUX.getMUX(mux-name)
和 QMUX.request()
方法向通道发送消息并接收其响应。