如何打印Log4j java sql logger(How to print Log4j java sql logger)
我想将log4j用于java和sql。 我想在我的班级中不使用“logger.debug(”log4j logger“)”打印java和sql日志。
下面是使用的类和log4j属性
package com.log4j; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class LogTest { public static void main(String[] args) throws Exception{ final Logger logger = Logger.getLogger(LogTest.class); PropertyConfigurator.configure("log4j.properties"); try { Class.forName("oracle.jdbc.OracleDriver"); Connection conn = DriverManager.getConnection("XXX", "YYY", "ZZZ"); String inserQuery = "insert into table1 (name,id) values (?,?)"; PreparedStatement prestat = conn.prepareStatement(inserQuery); prestat.setString(1, "Test"); prestat.setString(2, "2"); prestat.executeUpdate(); } catch (Exception ex) { System.out.println("Exception: " + ex.getMessage() + ""); } } }
以下是log4j属性
log4j.rootLogger=DEBUG,CA log4j.logger.java.sql=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.appender.CA=org.apache.log4j.ConsoleAppender log4j.appender.CA.layout=org.apache.log4j.PatternLayout log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
请指教。
任何帮助将不胜感激
谢谢
I want to use log4j for java and sql. i want to print the java and sql logs without using "logger.debug("log4j logger")" in my class.
Below are the class and log4j properties used
package com.log4j; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class LogTest { public static void main(String[] args) throws Exception{ final Logger logger = Logger.getLogger(LogTest.class); PropertyConfigurator.configure("log4j.properties"); try { Class.forName("oracle.jdbc.OracleDriver"); Connection conn = DriverManager.getConnection("XXX", "YYY", "ZZZ"); String inserQuery = "insert into table1 (name,id) values (?,?)"; PreparedStatement prestat = conn.prepareStatement(inserQuery); prestat.setString(1, "Test"); prestat.setString(2, "2"); prestat.executeUpdate(); } catch (Exception ex) { System.out.println("Exception: " + ex.getMessage() + ""); } } }
Below is the log4j properties
log4j.rootLogger=DEBUG,CA log4j.logger.java.sql=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.appender.CA=org.apache.log4j.ConsoleAppender log4j.appender.CA.layout=org.apache.log4j.PatternLayout log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Please advise.
Any help will be appreciated
Thanks
原文:
最满意答案
以下应该做你想要的:
import signal import threading from time import sleep keep_running = True def signal_handler(signal, frame): global keep_running keep_running = False print("Received SIGINT\n") signal.signal(signal.SIGINT,signal_handler) def work(): while keep_running: sleep(2) print("Worker finished\n") nbThreads = 2 threads = [] for i in range(nbThreads): t = threading.Thread(target=work) t.setDaemon(True) t.start() threads.append(t) while any([t.isAlive() for t in threads]): sleep(0.1)
让这个程序运行产生
Received SIGINT Worker finished Worker finished
说明:当按下CTRL-C时,程序接收到一个
signal_handler
,signal_handler
调用已注册的处理程序signal_handler
,将全局变量keep_running
设置为False
。 同时主线程等待所有生成的线程死亡。 因此,这些线程可以在主线程终止之前完成它们正在做的任何事情(在这种情况下是sleep
)。注意:在Linux上等待信号可以通过调用
signal.pause()
(替换sleep(0.1)
)来实现。 在Windows上,这是不可能的,因为此功能不存在。 因此,上述内容应该不依赖于平台。The following should do what you want:
import signal import threading from time import sleep keep_running = True def signal_handler(signal, frame): global keep_running keep_running = False print("Received SIGINT\n") signal.signal(signal.SIGINT,signal_handler) def work(): while keep_running: sleep(2) print("Worker finished\n") nbThreads = 2 threads = [] for i in range(nbThreads): t = threading.Thread(target=work) t.setDaemon(True) t.start() threads.append(t) while any([t.isAlive() for t in threads]): sleep(0.1)
Letting this program run yields
Received SIGINT Worker finished Worker finished
Explanation: When CTRL-C is pressed the program receives a
signal.SIGINT
which causes the registered handlersignal_handler
to be called setting the global variablekeep_running
toFalse
. Meanwhile the main thread waits for all spawned threads to die. Thus these threads can finish whatever they were doing (in this casesleep
-ing) before the main thread terminates.Note: On Linux waiting for a signal could be achieved by calling
signal.pause()
(replacing thesleep(0.1)
). On Windows this is not possible because this function does not exist. Therefore the above should be less platform-dependant.
相关问答
更多-
finish
-
我采取的方法是使用ExecutorService来管理线程池。 ExecutorService es = Executors.newCachedThreadPool(); for(int i=0;i<5;i++) es.execute(new Runnable() { /* your task */ }); es.shutdown(); boolean finshed = es.awaitTermination(1, TimeUnit.MINUTES); // all tasks have fin ...
-
线程在调用run方法后自行关闭。 阅读此部分以获取更多信息https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html 编辑:如果你想避免这种行为,我建议使用ThreadPools。 Threads close themselves after the run method has been called. Read this for further information https://docs.oracle.com/javase/7/d ...
-
你无法看到stderr,因为你打印了很多标准输出,但是你有这个错误: Traceback (most recent call last): File "test.py", line 29, in
for thread in threading.enumerate(): NameError: name 'threading' is not defined 如果我将import threading添加到顶端,我会得到以下输出: Time for 1 thread: 1.02248 ... -
互锁。在启动任何线程之前增加一个初始化为零的计数器。 Interlocked.Decrement退出/回送之前每个线程中的计数器。 如果任何线程将计数器递减为零,则设置()一个AutoResetEvent。 AutoResetEvent上的WaitOne()。 Rgds,Martin Interlocked.Increment an initially zeroed counter just before starting any thread. Interlocked.Decrement a counte ...
-
声明在python3中将抽象基类更改为: import abc class Base(metaclass=abc.ABCMeta): @abc.abstractmethod def bar(self): pass class Concrete(Base): pass Concrete() # Will raise a TypeError Declaring an abstract base class changed in python3 to: imp ...
-
这是条件变量的一个相当简单的用例。 具有活动工作项数的整数计数,受到互斥保护。 此外,还有两个条件变量,一个用于发信号通知工作在队列中可用的工作线程,另一个用于表示线程已完成的主线程。 就像是: main: set freethreads to numthreads init mutex M, condvars TOMAIN and TOWORKER start N worker threads while true: wait for work item ...
-
我将研究通过ThreadPool.QueueUserWorkItem运行您的方法,然后使用WaitHandle.WaitAll等待所有这些方法完成。 I'd look into running your method via ThreadPool.QueueUserWorkItem and then using WaitHandle.WaitAll to wait for all of them to complete.
-
在您的示例中,线程不会同时启动。 在SetMaxThreads之后立即添加以下调用 ThreadPool.SetMinThreads(200, 200); 这将使线程同时启动。 这是关于ThreadPool线程创建机制的东西。 我建议阅读ThreadPool文档了解详细信息。 要更正确地调试它,请更新ThreadWhichWillCallSQL_test方法以添加开始时间: static void ThreadWhichWillCallSQL_test(object o1) { ...
-
Python3让线程在引发keyboardexception时完成(Python3 Let threads finish when keyboardexception raised)[2023-07-13]
以下应该做你想要的: import signal import threading from time import sleep keep_running = True def signal_handler(signal, frame): global keep_running keep_running = False print("Received SIGINT\n") signal.signal(signal.SIGINT,signal_handler) def work ...