overuse of ForContext() ?

1,053 views
Skip to first unread message

Jesse Beard

unread,
Apr 3, 2014, 8:28:26 AM4/3/14
to ser...@googlegroups.com
Howdy,

I wanted to present a Serilog log statement which produces incredible output in Seq for debugging and general logging, but want to make sure, that in general, this approach with Serilog is acceptable.

(I know this may wrap some in the browser....)

this._logger
    .ForContext("ModbusDeviceId", modbusDevice.ModbusDeviceId)
    // as configured via CASLink.
    .ForContext("CASLink_SetpointId", range.Setpoint.Id)
    .ForContext("CASLink_SetpointName", range.Setpoint.Name)
    .ForContext("CASLink_Start", range.Start)
    .ForContext("CASLink_End", range.End)
    .ForContext("CASLink_Duration"string.Format("{0:%d} days, {0:%h} hours, {0:%m} minutes", (range.End - range.Start)))
    .ForContext("CASLink_Duration_Seconds", (range.End - range.Start).TotalSeconds)
    .ForContext("CASLink_CoolingSetpoint", range.Setpoint.CoolingTemp)
    .ForContext("CASLink_HeatingSetpoint", range.Setpoint.HeatingTemp)
    .ForContext("CASLink_ControlMode", range.Setpoint.ControlMode.ToString())
    .ForContext("CASLink_BlowerMode", range.Setpoint.BlowerMode.ToString())
    // formatted values as sent to the RTU.
    .ForContext("RTU_Duration"string.Format("{0:%d} days, {0:%h} hours, {0:%m} minutes"TimeSpan.FromSeconds(rtuSetpoint.duration.SwapWords())))
    .ForContext("RTU_Duration_Seconds", rtuSetpoint.duration.SwapWords())
    .ForContext("RTU_ControlMode", ((ControlMode)Enum.Parse(typeof(ControlMode), rtuSetpoint.controlMode.ToString())).ToString())
    .ForContext("RTU_BlowerMode", ((BlowerMode)Enum.Parse(typeof(BlowerMode), rtuSetpoint.blowerMode.ToString())).ToString())
    .ForContext("RTU_CoolingSetpoint", rtuSetpoint.coolingSetpoint.AsTemperature())
    .ForContext("RTU_HeatingSetpoint", rtuSetpoint.heatingSetpoint.AsTemperature())
    .ForContext("RTU_Start", rtuSetpoint.startTime.SwapWords().FromCenturyTime().ToString())
    .ForContext("RawRtuSetpoint"new { rtuSetpoint.startTime, rtuSetpoint.duration, rtuSetpoint.controlMode, rtuSetpoint.blowerMode, rtuSetpoint.coolingSetpoint, rtuSetpoint.heatingSetpoint })
        .Write(logLevel, "{logPrefix} starts at {StartTime} and ends at {EndTime}.",
            logPrefix,
            rangeStart,
            rangeEnd);

Ignoring where values come from, etc., is this considered an "ok" use of Serilog ForContext()?  This log statement will execute, typically, at Debug level depending on other conditions, hence the supplying of logLevel to the .Write() method.

And in Seq, you get killer output, with additional context properties being added from higher-level using() blocks that are also pushing Context properties using LogContext.PushProperty().  My goal here is a nice, simple rendered message with tons of context properties for additional data.




nblum...@nblumhardt.com

unread,
Apr 3, 2014, 5:38:55 PM4/3/14
to ser...@googlegroups.com
Hi Jesse,

There's definitely no harm in this - each nested logger is very lightweight, and there's not really any nicer syntax built in to Serilog at the moment. But, it does seem like something we could improve support for.

I've got a couple of ideas but no clear winner, I've raised a ticket at https://github.com/serilog/serilog/issues/104

Cheers,
Nick
Reply all
Reply to author
Forward
0 new messages