如何从日志中获取值到 java 列表? <hibernate>
How to get values from logs into java list? <hibernate>
是否可以从控制台获取该值:
并将它们保存到 java list/map?
我是这样打印日志的:
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
我的查询:
@Transactional
public String executeSQL(String[] split){
SessionFactory hibernateFactory = someService.getHibernateFactory();
String message = null;
int rows = 0;
EntityManager entityManager = hibernateFactory.createEntityManager();
EntityTransaction utx = entityManager.getTransaction();
for (int i = 0; i < split.length; i++) {
String query = split[i];
try {
utx.begin();
Query query1 = entityManager.createNativeQuery(query);
rows = query1.executeUpdate();
utx.commit();
try{
resultList = query1.getResultList();
resultList.stream().map(Arrays::toString).forEach(System.out::println);
}
catch(Exception e){
}
message = "Success \n{ ["+rows+"] <--- affected rows}";
}catch (PersistenceException e){
utx.rollback();
message = (((SQLGrammarException)e.getCause()).getSQLException()).getMessage();
}
}
entityManager.close();
return message;
}
我知道如何将值保存到列表中,如您所见,但我无法提取列...因为没有关于列名称的信息。在日志中,列有名称,列也有类型,这些信息对我很有用。
作为一个选项,它的实现方式是 Logback Appender
一旦你登录到 appender,你就可以实现过滤和任何你需要的东西。
1.Add 对 logback-classic 的依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
2.Add logback.xml 资源
<configuration>
<appender name="list" class="com.test.ListAppender"/>
<root level="info">
<appender-ref ref="list"/>
</root>
</configuration>
3.Implement 附加程序 class
package com.test;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import java.util.LinkedList;
import java.util.List;
public class ListAppender extends AppenderBase<ILoggingEvent> {
private static List<ILoggingEvent> eventList = new LinkedList<>();
@Override
protected void append(ILoggingEvent event) {
eventList.add(event);
}
public List<ILoggingEvent> getEventList() {
return eventList;
}
}
4.Test 你的代码
package com.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
static ListAppender listAppender = new ListAppender();
public static void main(String[] args) {
logger.info("Hello World");
listAppender.getEventList().forEach(entry -> System.out.println("print log from list:" + entry));
System.out.println();
}
}
是否可以从控制台获取该值:
我是这样打印日志的:
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
我的查询:
@Transactional
public String executeSQL(String[] split){
SessionFactory hibernateFactory = someService.getHibernateFactory();
String message = null;
int rows = 0;
EntityManager entityManager = hibernateFactory.createEntityManager();
EntityTransaction utx = entityManager.getTransaction();
for (int i = 0; i < split.length; i++) {
String query = split[i];
try {
utx.begin();
Query query1 = entityManager.createNativeQuery(query);
rows = query1.executeUpdate();
utx.commit();
try{
resultList = query1.getResultList();
resultList.stream().map(Arrays::toString).forEach(System.out::println);
}
catch(Exception e){
}
message = "Success \n{ ["+rows+"] <--- affected rows}";
}catch (PersistenceException e){
utx.rollback();
message = (((SQLGrammarException)e.getCause()).getSQLException()).getMessage();
}
}
entityManager.close();
return message;
}
我知道如何将值保存到列表中,如您所见,但我无法提取列...因为没有关于列名称的信息。在日志中,列有名称,列也有类型,这些信息对我很有用。
作为一个选项,它的实现方式是 Logback Appender 一旦你登录到 appender,你就可以实现过滤和任何你需要的东西。
1.Add 对 logback-classic 的依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
2.Add logback.xml 资源
<configuration>
<appender name="list" class="com.test.ListAppender"/>
<root level="info">
<appender-ref ref="list"/>
</root>
</configuration>
3.Implement 附加程序 class
package com.test;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import java.util.LinkedList;
import java.util.List;
public class ListAppender extends AppenderBase<ILoggingEvent> {
private static List<ILoggingEvent> eventList = new LinkedList<>();
@Override
protected void append(ILoggingEvent event) {
eventList.add(event);
}
public List<ILoggingEvent> getEventList() {
return eventList;
}
}
4.Test 你的代码
package com.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
static ListAppender listAppender = new ListAppender();
public static void main(String[] args) {
logger.info("Hello World");
listAppender.getEventList().forEach(entry -> System.out.println("print log from list:" + entry));
System.out.println();
}
}