Log4j2通过根类路径中的log4j2.xml
配置文件很好地与Spring Boot配合使用,正如文档所述。
尝试将此文件移动到其他位置时,我无法在启动时将新位置传递给Spring。来自the documentation:
可以通过包含来激活各种日志记录系统 类路径上的相应库,并进一步自定义 在类路径的根目录中提供合适的配置文件, 或者在Spring Environment属性指定的位置
logging.config
我尝试使用Java系统属性设置新位置
java -jar -Dlogging.config="classpath:/config/log4j2.xml" target/app.jar
或使用包含相关属性的外部application.properties
logging.config=classpath:/config/log4j2.xml
但我经常受到以下错误消息的欢迎。
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
答案 0 :(得分:21)
如Spring reference documentation中所述,无法在应用程序属性中设置logging.config
属性,因为在初始化日志记录后会读取它们。
解决方案是以这种方式提供外部日志记录配置的路径:
java -Dlogging.config='/path/to/log4j2.xml' -jar app-current.jar
答案 1 :(得分:2)
micpalmia的答案绝对正确。
我需要将配置放在类路径之外我不想将配置文件作为参数传递。所以我在类路径资源中添加了一个非常简单的日志记录配置,并让spring boot应用程序在启动时重新配置日志记录,如下所示:
@SpringBootApplication
public class Application implements CommandLineRunner {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... param) throws UnsupportedEncodingException {
Configurator.initialize(null, "config/log4j2.xml");
// ...
}
}
这种方法有一个明显的缺点:整个应用程序启动过程不会记录为外部配置。但是一旦运行自定义代码,记录器就会按预期工作。虽然你可能没有,但我发现这是一种我可以接受的妥协。
答案 2 :(得分:1)
我的项目中存在同样的问题,除了log4j2.xml之外,我还需要类路径中的其他配置文件。 这是我的两个解决方案:
解决方案1:使用org.springframework.boot.loader.JarLauncher启动Spring启动应用程序
echo "alert('$message');\n";
解决方案2:写一个' ./ config' jar中的MANIFEST.MF中的类路径条目
using (SqlConnection conn = new SqlConnection(your-connection-string)) {
conn.Open();
// 1. create a command object identifying the stored procedure
SqlCommand cmd = new SqlCommand("your-procedure-name", conn);
// 2. set the command object so it knows to execute a stored procedure
cmd.CommandType = CommandType.StoredProcedure;
// 3. add parameter to command, which will be passed to the stored procedure
cmd.Parameters.Add(new SqlParameter("@Username", textBox1.Text));
cmd.Parameters.Add(new SqlParameter("@Password", textBox2.Text));
// execute the command
using (SqlDataReader result = cmd.ExecuteReader()) {
// iterate through results, printing each to console
while (result .Read())
{
// Name and Password Should Match with your proc col name
var userName = result["Name"].toString();
var password = result["password"].toString();
}
}
}
答案 3 :(得分:0)
答案 4 :(得分:0)
如果是属性文件:
java -Dlog4j.configuration = file:/path/to/log4j.properties -jar app.jar
在Spring Boot 2中使用命令行即可。不要忘记在路径之前添加 file:。
答案 5 :(得分:0)
如log4j2文档here中所述,您可以在资源文件夹(或类路径中的任何位置)中包含名为log4j2.component.properties
的文件,并且可以在该文件内部提供文件名。这样的位置(或新文件名):
log4j.configurationFile=path/to/log4j2.xml
或
log4j.configurationFile=classpath:log4j2-custom.xml (if the file is on the classpath)
您也可以通过here的context-param
的{{1}}字段提供配置文件位置,但是我没有尝试过该选项
(这也适用于Spring Boot)