Adding AppenderRefs to the loggers in log4j2.xml:
<Loggers>
<!-- Root logger configuration -->
<Root level="WARN">
<AppenderRef ref="LOGFILE"/>
<AppenderRef ref="OSGI"/>
<AppenderRef ref="CRITICAL"/>
</Root>
<!-- Karaf Shell logger -->
<Logger level="OFF" name="org.apache.karaf.shell.support">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="CRITICAL"/>
</Logger>
<!-- openHAB specific logger configuration -->
<Logger level="INFO" name="org.openhab"/>
<Logger level="ERROR" name="openhab.event.ItemStateEvent"/>
<Logger level="ERROR" name="openhab.event.ItemStateUpdatedEvent"/>
<Logger level="ERROR" name="openhab.event.GroupStateUpdatedEvent"/>
<Logger level="ERROR" name="openhab.event.ItemAddedEvent"/>
<Logger level="ERROR" name="openhab.event.ItemRemovedEvent"/>
<Logger level="ERROR" name="openhab.event.ItemChannelLinkAddedEvent"/>
<Logger level="ERROR" name="openhab.event.ItemChannelLinkRemovedEvent"/>
<Logger level="ERROR" name="openhab.event.ChannelDescriptionChangedEvent"/>
<Logger level="ERROR" name="openhab.event.ThingStatusInfoEvent"/>
<Logger level="ERROR" name="openhab.event.ThingAddedEvent"/>
<Logger level="ERROR" name="openhab.event.ThingUpdatedEvent"/>
<Logger level="ERROR" name="openhab.event.ThingRemovedEvent"/>
<Logger level="ERROR" name="openhab.event.InboxUpdatedEvent"/>
<Logger level="ERROR" name="openhab.event.RuleStatusInfoEvent"/>
<Logger level="ERROR" name="openhab.event.RuleAddedEvent"/>
<Logger level="ERROR" name="openhab.event.RuleRemovedEvent"/>
<Logger level="ERROR" name="openhab.event.StartlevelEvent"/>
<Logger level="ERROR" name="openhab.event.AddonEvent"/>
<Logger additivity="false" level="INFO" name="openhab.event">
<AppenderRef ref="EVENT"/>
<AppenderRef ref="OSGI"/>
<AppenderRef ref="CRITICAL"/>
</Logger>
<Logger level="ERROR" name="javax.jmdns"/>
<Logger level="ERROR" name="org.jupnp"/>
<!-- This suppresses all Maven download issues from the log when doing feature installations -->
<!-- as we are logging errors ourselves in a nicer way anyhow. -->
<Logger level="ERROR" name="org.ops4j.pax.url.mvn.internal.AetherBasedResolver"/>
<!-- Filters known issues of pax-web (issue link to be added here). -->
<!-- Can be removed once the issues are resolved in an upcoming version. -->
<Logger level="OFF" name="org.ops4j.pax.web.pax-web-runtime"/>
<!-- Filters known issues of lsp4j, see -->
<!-- https://github.com/eclipse/smarthome/issues/4639 -->
<!-- https://github.com/eclipse/smarthome/issues/4629 -->
<!-- https://github.com/eclipse/smarthome/issues/4643 -->
<!-- Can be removed once the issues are resolved in an upcoming version. -->
<Logger level="OFF" name="org.eclipse.lsp4j"/>
<!-- Filters warnings for events that could not be delivered to a disconnected client. -->
<Logger level="ERROR" name="org.apache.cxf.jaxrs.sse.SseEventSinkImpl"/>
<!-- Filters warnings from broken connections during startup -->
<!-- https://github.com/openhab/openhab-core/issues/2998 -->
<Logger level="ERROR" name="org.apache.cxf.phase.PhaseInterceptorChain"/>
<!-- Filters known issues of KarServiceImpl, see -->
<!-- https://github.com/openhab/openhab-distro/issues/519#issuecomment-351944506 -->
<!-- Can be removed once the issues are resolved in an upcoming version. -->
<Logger level="ERROR" name="org.apache.karaf.kar.internal.KarServiceImpl"/>
<!-- Filters warnings about unavailable ciphers when JCE is not installed, see -->
<!-- https://github.com/openhab/openhab-distro/issues/999 -->
<Logger level="ERROR" name="org.apache.karaf.shell.ssh.SshUtils"/>
<!-- Filters known issues of javax.mail, see -->
<!-- https://github.com/openhab/openhab-addons/issues/5530 -->
<Logger level="ERROR" name="javax.mail"/>
<!-- Filters disconnection warnings of the ChromeCast Java API, see -->
<!-- https://github.com/openhab/openhab-addons/issues/3770 -->
<Logger name="su.litvak.chromecast.api.v2.Channel"/>
<!-- Added by Karaf to prevent debug logging loops, see -->
<!-- https://issues.apache.org/jira/browse/KARAF-5559 -->
<Logger level="WARN" name="org.apache.sshd"/>
<Logger name="org.openhab.binding.connectedcar"/>
<Logger level="WARN" name="org.openhab.binding.shelly"/>
</Loggers>
Template for new log file
This will change the format of our new log file. In our case a json stream. Adjust the path and file name in xml tag JsonTemplateLayout, attribute eventTemplateUri
{
"timestamp": {
"$resolver": "timestamp",
"pattern": {
"format": "yyyy-MM-dd'T'HH:mm:ss.SSS",
"timeZone": "CET"
}
},
"level": {
"$resolver": "level",
"field": "name"
},
"message": {
"$resolver": "message",
"stringified": true
},
"threadName": {
"$resolver": "thread",
"field": "name"
},
"threadId": {
"$resolver": "thread",
"field": "id"
},
"loggerName": {
"$resolver": "logger",
"field": "name"
},
"loggerFQCN": {
"$resolver": "logger",
"field": "fqcn"
},
"labels": {
"$resolver": "mdc",
"flatten": true,
"stringified": true
},
"tags": {
"$resolver": "ndc"
},
"marker": {
"$resolver": "marker",
"field": "name"
},
"errorType": {
"$resolver": "exception",
"field": "className"
},
"errorMessage": {
"$resolver": "exception",
"field": "message"
},
"errorStacktrace": {
"$resolver": "exception",
"field": "stackTrace",
"stackTrace": {
"stringified": true
}
}
}
Rule to import the critical.log file into an item:
var Paths = Java.type("java.nio.file.Paths");
var Files = Java.type("java.nio.file.Files");
var StandardCharsets = Java.type("java.nio.charset.StandardCharsets");
var path = Paths.get("/var/log/openhab/critical.log");
if (Files.exists(path)) {
var content = Files.readString(path, StandardCharsets.UTF_8).trim();
if (content.endsWith(",")) {
content = content.replace(/,\s*$/, "");
}
content = "[" + content + "]";
var count = JSON.parse(content).length;
items.vLog.postUpdate(content);
items.vLogCount.postUpdate(count);
}
List which contains all log entries and opens a popup when you click on a list-item:
- component: f7-list
config:
bg-color: white
class: -list
inset: true
mediaList: true
noHairlinesBetween: false
slots:
default:
- component: oh-repeater
config:
for: rLog
fragment: true
in: =JSON.parse(@@'vLog')
sourceType: array
slots:
default:
- component: oh-list-item
config:
action: variable
actionVariable: logDetails
actionVariableValue: =JSON.stringify(loop.rLog_source[loop.rLog_idx])
badge: =loop.rLog.level
badgeColor: =(loop.rLog.level == "WARN")?"yellow":"red"
popupOpen: =".open-popup-logdetails"
subtitle: =loop.rLog.timestamp + ", " + loop.rLog.threadName
title: =loop.rLog.message
- component: f7-popup
config:
class: ="open-popup-logdetails"
closeByBackdropClick: true
closeOnEscape: true
style:
overflow-y: visible
swipeToClose: false
slots:
default:
- component: widget:popup-logdetails
config: {}
Popup window with log details:
uid: popup-logdetails
tags:
- expanded-card-status
props:
parameters: []
parameterGroups: []
timestamp: Dec 28, 2025, 8:24:56 PM
component: f7-block
config:
style:
--f7-navbar-bg-color: transparent
--f7-navbar-link-color: blue
--f7-navbar-text-color: black
-webkit-user-drag: none
-webkit-user-select: none
margin: 0px
overflow-y: visible
padding: 0px
user-drag: none
user-select: none
width: 100%
z-index: 9999
slots:
default:
- component: f7-navbar
config:
style:
position: sticky
title: Details
slots:
right:
- component: oh-link
config:
action: popup
iconColor: black
iconF7: multiply_circle_fill
iconSize: = 30px
popupClose: =".open-popup-logdetails"
- component: Label
config:
style:
-webkit-user-select: all
margin: 10px 0px 10px 23px
padding: 0
user-select: all
text: =JSON.parse(vars.logDetails).message
- component: f7-list
config:
bg-color: white
inset: true
mediaList: false
noHairlinesBetween: false
style:
--f7-list-inset-border-radius: 8px
margin-top: 0
slots:
default:
- component: oh-repeater
config:
for: vLog
fragment: true
in:
- vId: bundle.id
vLabel: Bundle ID
- vId: bundle.name
vLabel: Bundle Name
- vId: bundle.version
vLabel: Bundle Version
- vId: threadName
vLabel: Thread Name
- vId: threadId
vLabel: Thread ID
- vId: loggerName
vLabel: Logger Name
- vId: loggerFQCN
vLabel: Logger FQCN
- vId: labels
vLabel: Thread Context Data (MDC)
- vId: tags
vLabel: Thread Context Stack (NDC)
- vId: marker
vLabel: Marker
- vId: errorMessage
vLabel: Stack Trace - Message
- vId: errorType
vLabel: Stack Trace - Klasse
- vId: errorStacktrace
vLabel: Stack Trace
sourceType: array
slots:
default:
- component: f7-list-item
config: {}
slots:
inner-start:
- component: Label
config:
style:
font-size: 12px
width: 110px
text: =loop.vLog.vLabel
- component: Label
config:
style:
-webkit-user-select: all
font-size: 12px
text-align: left
user-select: all
width: 80%
text: =JSON.parse(vars.logDetails)[loop.vLog.vId]