Getting daily error overview

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]