如何在Liferay DXP 7.2的mvc-portlet中使用slf4j替代内置日志
Liferay DXP 7.2 MVC-Portlet 替换默认日志为SLF4J实现方案
1. 依赖调整(pom.xml配置)
首先排除Liferay默认日志接口依赖,引入SLF4J相关依赖,示例配置如下:
<dependencies> <!-- 排除Liferay内核默认日志依赖 --> <dependency> <groupId>com.liferay.portal</groupId> <artifactId>com.liferay.portal.kernel</artifactId> <version>4.0.0</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.liferay</groupId> <artifactId>com.liferay.util.bridges</artifactId> <version>6.0.0</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>com.liferay.portal</groupId> <artifactId>com.liferay.portal.kernel.log</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入SLF4J依赖,Liferay平台已自带,scope设为provided即可 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> <scope>provided</scope> </dependency> <!-- Commons Logging桥接至SLF4J,兼容原有依赖的日志输出 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.30</version> <scope>provided</scope> </dependency> </dependencies>
2. BND文件配置(屏蔽默认日志导入)
修改模块根目录下的bnd.bnd文件,添加如下配置,避免OSGi容器导入Liferay默认日志接口:
Bundle-Name: 你的Portlet显示名称 Bundle-SymbolicName: 你的Portlet唯一标识 Bundle-Version: 1.0.0 Export-Package: 按需填写导出的包,无则留空 # 核心配置:排除Liferay默认日志包导入 Import-Package: \ !com.liferay.portal.kernel.log,\ * -sources: true
3. 关闭Liferay默认日志相关配置
- 关闭默认XML日志输出:在Liferay根目录
portal-ext.properties文件中添加配置
log.config.xml.enabled=false
- 禁用Portlet默认日志输出:登录Liferay后台,进入
控制面板→配置→系统设置→基础→日志级别,找到你的Portlet对应包名,将原有Liferay日志实现的级别调整为OFF,新增SLF4J对应包的日志级别为所需级别(INFO/DEBUG等)
4. 代码使用示例
直接在MVC Portlet类中调用SLF4J API即可,示例如下:
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.portlet.Portlet; import javax.portlet.PortletException; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import java.io.IOException; @Component( immediate = true, property = { "com.liferay.portlet.display-category=category.sample", "com.liferay.portlet.header-portlet-css=/css/main.css", "com.liferay.portlet.instanceable=true", "javax.portlet.display-name=DemoSlf4jPortlet", "javax.portlet.init-param.template-path=/", "javax.portlet.init-param.view-template=/view.jsp", "javax.portlet.name=DemoSlf4jPortlet", "javax.portlet.resource-bundle=content.Language", "javax.portlet.security-role-ref=power-user,user" }, service = Portlet.class ) public class DemoSlf4jPortlet extends MVCPortlet { // 初始化SLF4J日志实例 private static final Logger LOGGER = LoggerFactory.getLogger(DemoSlf4jPortlet.class); @Override public void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { // 不同级别日志使用示例 LOGGER.debug("调试日志:进入doView方法"); LOGGER.info("信息日志:Portlet被访问,会话ID:{}", renderRequest.getPortletSession().getId()); if(LOGGER.isWarnEnabled()){ LOGGER.warn("警告日志:演示警告输出"); } try { // 业务逻辑 } catch (Exception e) { LOGGER.error("错误日志:业务执行异常", e); } super.doView(renderRequest, renderResponse); } }
注意事项
- 不要自行引入SLF4J的具体实现(如logback、log4j2),Liferay平台已提供统一的日志实现,自行引入会导致类冲突
- 日志级别调整优先通过Liferay后台系统设置配置,无需额外添加日志配置文件到Portlet模块
- 如果依赖的第三方工具包使用了其他日志接口,可引入对应桥接包(如log4j-over-slf4j、jul-to-slf4j)统一输出到SLF4J
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

