4 ms·
We're currently evaluating options, but for .NET Serilog is shaping up extremely nicely, and Seq/Logg.ly as log sinks are nice... Seq is great because you can
by rjbwork 12y ago
We're currently evaluating options, but for .NET Serilog is shaping up extremely nicely, and Seq/Logg.ly as log sinks are nice...
Seq is great because you can set up your own instance very near to your servers for low-latency/high-bandwidth logging, which really changes the game in terms of what you can feasibly (perf/financially) log. It also has some decent visualization options, and it's got some great integrations, with a decent plugin architecture to create your own real-time log processing code.
Logg.ly has some amazing GUI/search options.
- redwards510 12y agoWe've been using Serilog/Seq and we're extremely happy with it. I'm a little surprised that you didn't mention the buzzword "Structured Logging", which is the special sauce that makes Serilog stand out. Instead of concatenating strings with values, you assign keywords to values which you can later search on. For example, Log.Info("Customer# {customerNumber} completed transaction {transactionId}", customerNumber, transactionId); Then using the Seq log viewer you can simply click on "transactionId" in the log line and filter by "transactionId = 456" or whatever. It's one of the most exciting advancements I've seen in the .Net logging world. EDIT: I realized I didn't really answer OPs question regarding space. If you used Serilog, you can set up different sinks to export to, with different options. For example, you could send all your logs to mongodb, and just recent 1 week rolling logs to the Seq server.
- mdaniel 12y agoWhen I've heard "structured logging" used, it has been in the context of much more key-value pairs than just having keywords next to values, e.g. Log.Info("customerNum={customerNumber} transactionId={transactionId} state=completed", cN, tID) or the ever popular logstash-y format: Log.Info(LogState.Add("state", "completed").Add("customerId", customerId).Add("transactionId", transactionId)); where `LogState` would build up a key-value dict and its `ToString` would emit the logstash JSON format. I guess the version that works best depends on the tool that is consuming the log text.
- rjbwork 12y agoIn the end, serilog, depending on the sink, makes your log look like the template, and attaches the meta data of your template variable names and replacement values to the message itself.
- Nelkins 12y agoAre you able to use Serilog for metrics in addition to application events? I'm thinking something like average time for a method to execute, things like that. And if so, what tools do you use to comb through that data (to determine average execution times, for example). Right now at work everyone just logs to a single CSV with an inconsistent format and it makes me cringe every time I look at it. It's also really difficult to parse.
- redwards510 12y agoI recently used the SerilogMetrics [1] NuGet package to determine the elapsed time between method calls. Worked great, although I couldn't figure out how to use my standard logging config that is carried in the static logging object and had to redefine the seq server I wanted those lines logged to in the class itself. This may have just been unfamiliarity on my part. Your current way does sound like a headache. If your logging lines are in the standard NLog format, you should be able to drop in serilog without many changes. [1] https://github.com/serilog-metrics/serilog-metrics https://github.com/serilog-metrics/serilog-metrics
- rjbwork 12y agoWe've evaluated loggly, logentries, splunk, and Seq. The first 3 are fine depending on your logging needs. Seq can handle a TON of events thrown at it, and the latest stuff (~1 day old or so) is extremely accessible. The older stuff takes a little longer to search through though.