- Add user-agent to the list of interesting headers in HTTP ingestion
- Minor fixes
- Start web server latency histogram from 0.000 005 seconds, i.e. 5µs.
- Minor bugfix in header reading
- Support capturing certain reverse proxy headers, like geoip
- Avoid BOM marks in Prometheus
- More message types
- Upgrade to net5.0 and improve builds for Rutta
- Logary v5 🦄
- Retry NuGet release + index, thanks @haf
- Downgrade to F# 4.6.2 since 4.7.0 is broken for TypeProviders, thanks @haf
- Implement OpenTelemetry specification for Trace (tracing), thanks @haf
- Implement nice Jaeger samplers, thanks @haf
- Default AsyncLocal SpanContext storage to being off, thanks @haf
- Improve Logary.Suave example with Trace support, thanks @haf
- Clean up unit tests in Logary.Tests, thanks @haf
- Made Prometheus exporter export convention-based Spans, thanks @haf
- Add
Message.{setReceiveTimestamp,setReceiveEpochNano}
for ingestion points to use, thanks @haf
- BREAKING: move Logary.Message.Patterns to Logary.MessagePatterns, thanks @haf
- Roundtripping JSON encode/decode, thanks @haf
- Prometheus Support 🎉, thanks @lust4life
- Google Pub/Sub support 🎊, thanks @haf
- New domain with docs at https://logary.tech 😎, thanks @haf
- Build improvements, thanks @haf
- Logary Dash target, thanks @haf
- Improve ISO8601 with JSON parsing, fixes #400, thanks @haf
- Correct ZMQ installation in Debian-based Dockerfile for Rutta, second try, thanks @haf
- Correct ZMQ installation in Debian-based Dockerfile for Rutta, thanks @haf
- Correct response headers for CORS POST requests for /i/logary, thanks @haf
- Enable project id discoverability with google metadata server in Stackdriver, thanks @haf
- Create a new Google BigQuery target, thanks @haf
- Stability fixes for Rutta JSON ingestion, thanks @haf
- Improve sending of StacktraceLine[] to Stackdriver, thanks @haf
- Print better help message for UDP ingestion targets, thanks @haf
- Ensure Rutta / HTTP codec logs errors to stdout, thanks @haf
- Ensure Rutta / HTTP codec can optionally enable CORS, thanks @haf
- Allow HTTP codec to be nicely parametised with onSuccess, onFailure, thanks @haf
- Extract TCP ingestion to its own package, thanks @haf
- Print ZMQ version on start of Rutta, thanks @haf
- Update README for newest Rutta, thanks @haf
- Upgrade/fix Rutta command line parsing to assist user better and not crash
dotnet
, thanks @haf - Remove older mono's from .travis.yml, thanks @haf
- Set up Travis to push docker image on git tags, thanks @haf
- Create
haaf/rutta-curl
image as a utility image, thanks @haf - Create
Makefile
for simpler builds, thanks @haf - Enable smart version+tag docker image tagging in Makefile, thanks @haf
- Finish writing LICENSE.md, thanks @haf
- Upgrade all .Tests and Services to netcoreapp2.2, thanks @haf
- Rename ElasticSearch -> Elasticsearch, thanks @haf
- Normalise Elasticsearch, Jaeger and ApplicationInsights naming and module layout, thanks @haf
- Pretty-print F# function signatures when instances thereof are logged, thanks @haf
- Fix bug in JSON encoder that missed null strings, thanks @haf
- Create an IngestServer abstraction and module, thanks @haf
- Port all Ingestion implementation to the new IngestServer abstraction, thanks @haf
- Move
ensureName
from middleware toLogger
in Logary, thanks @haf - Add Rutta Helm chart, thanks @haf
- BREAKING CHANGE. Change error model and failed-logs-model to be configuration based, #378, thanks @lust4life
- Merge ASP.Net Core adapter into Logary repo proper #381, thanks @lust4life
- Migrate build process to FAKE 5 on .Net Core #380, thanks @lust4life
- Make tags opt-in for Influx target (on master)
- Make tags opt-in for Influx target
- Switch Opsgenie alias/message around #369, thanks @haf
- Upgrade to F# v4.5 and Hopac v0.4, fixes #367, thanks @haf
- Remove assembly redirects for Stackdriver, thanks @haf
- Upgrade all dependencies, except; constrain Suave <2.5, thanks @haf
- Fix timestamp JSON deserialisation error — assume we get timestamp in ns since epoch or ISO8601 TS, thanks @haf
- Fix #365 — thanks @haf — support for ingesting batched messages
- Fix #349 via #363 — thanks @akselsson
- Fix #357 — for simple exns
- Fix #357 — for AggregateException
- Rename
StacktraceParse.InnerDelim
->StacktraceParse.StacktraceDelim
, since it's being used for non-inner stacktrace delimitations.
- Enable access to Suave.HttpContext for HTTP ingestion
- Fix #354 — Facade v4
getExns
may return nulls - Fix #350 — Ensure
setLastName
in Facade keeps the parent logger name - Fix #355 — Facade v4, support pretty printing context values
- Fix #356 — Ensure addExn gets printed with plain console
- Ref #348 — wait for buffers - don't throw exceptions; push fix till later
- Ref #348 — bump Stackdriver buffer size
- Fix #348 — wait for buffers
- Make Adapter.getLogger a verbose log operation
- Fix #347 - BufferFull result from Logary proper, through Facade cast exn
- Fix #346 — Stackdriver not sending Logger.name — now sent as
labels.logger
. - Fix #343 — prettyprint IPEndPoint and IPAddress
- Fix #341 — template from context as well as fields
- Fix #340 — Pass value and formatted values
- Fix #339 — Handle more common/known types in the Json serialiser
- Fix inverted if-statement in printDotOnOverflow
- Build Facade v4 for Hopac-based software, thanks @haf
- Preserve non-exceptions in error field, thanks @yoff
- Fix crash when comparing versions in adapter, thanks @yoff
- Adapter handles gauges and their units better, allowing the Facade to pass in metrics, thanks @yoff
- Add in Scope support, thanks @haf and @lust4life
- Fix #336 — more than ~25 crashes of a Target would crash Logary with an arithmetic overflow. Thanks @haf
- Dot not crash on typecasts when constructing log message, thanks @yoff
- Cross-compile Rutta for .net core, subject to these limitations Topshelf/Topshelf#444, thanks @haf
- Fix #330 – tagging Gauges, thanks @haf
- Fix #302 – Struct for Gauge, thanks @haf
- Bump dependency on NodaTime, Http.fs
- Logary.Ingestion.HTTP.HTTPConf: IVar -> Promise correction see #332
- Disable stacktrace parsing for log4jxml codec (could possibly be made a boolean instead), thanks @pakselsson
- Cross-compile Logary.Adapters.EventStore (net461;netstandard2.0), thanks @haf
- Move Newtonsoft.Json asm redirect to Stackdriver target, thanks @haf
- Improve stacktrace parsing for WCF stacktraces, thanks @haf
- Adding Logary.PerfTests to track #322 thanks @haf
- Fix #318, move Logary.EventProcessing -> Logary.Configuration
- Correct Stopwatch.Frequency measurements for high-frequency timers. Thanks @haf
- Add Gauge.of{StopwatchTicks,...} methods, thanks @haf
- Add Logger.time{Alt,Job,Fun} for timing of Hopac things and F# functions, thanks @haf
- Binding redirect for Rutta / Newtonsoft.Json #324, thanks @akselsson
- System.Diagnostics.Trace target
- Published haaf/rutta docker container
- Improved JSON codec to capture
error
field. - Documented Rutta with screenshots and docs in README
- Support parsing exn type and inner exception messages from .Net and Java stacktraces. Thanks @haf
- Fix most of #294, thanks @haf
- Fix #285 for LiterateConsole. This should be it. Thanks @haf.
- Move colourising tokenisers to a module more easily discoverable. Thanks @haf
- Fix #300 naming of Events.miniLevel -> minLevel, thanks @haf
- Fix #313 - passing along exns in the right format, thanks @haf
- Fix #314 - add a few missing SI units
- Fix #315 - print complete, parsed exns in console
- Add Topshelf and EventStore (for .Net Core) adapters
- Targets: AliYun target ported to .Net Core
- Targets: StackDriver target goes via JSON encoding; makes it total (AFAIK)
- Codecs: log4j XML fix correcting its timestamp handling
- Ingestion: Publish HTTP ingestion as package
- Ingestion: Publish UDP ingestion as package
- Rutta: support subcommand specification via App.config
- Rutta: better logging about what targets start in Router
- Core: Can generate nugets
- Core: Fully support both .Net Core and .Net FW, thanks @haf
- Core: Completely new internals with very similar public API, thanks @lust4life, @haf
- Core: Logary is now a simple stream processing library with a
processing
step, responsible for filtering, sorting, grouping, munging and huggingMessage
values as they flow past, and finally choosing whattarget
they end up in. Thanks to @haf for starting and @lust4life for completing this large piece of functionality. This also means theRule
API has changed. - Core: Message.value is now a string, use the
addGauge
family of functions to add gauges to it - Core: Move
RuntimeInfo
intoTargetAPI
interface, thanks @haf - Core: Map
2 -> HashMap
2, thanks to @mrange for the data structure—see https://github.com/mrange/fsharpadvent2016 for details. We expect this to lead to fewer allocations and a faster library. Thanks @haf for building it into Logary. (seeLogary.Message
) - Core:
Message.fields
->Message.{context,setField,tryGetField}
. You can also useMessage.Patterns
to pattern-match over all possible types of values that can be in the context, when iterating over them. Thanks @lust4life, @haf - Core: Use
TypeShape
instead of arbitrary reflection to destructure objects, thanks @lust4life, @haf and @eiriktsarpalis for creating the library in the first place. (seeLogary.Internals.TypeShape.{Core,Utils}
) - Core: Uses @neoeinstein's Chiron 7 from https://github.com/neoeinstein/chiron/tree/chiron-7 for all JSON-oriented tasks. Thanks @lust4life for getting this started. (see
Logary.Internals.Chiron
) - Core: Upgraded Aether (under
Logary.Internals.Aether
) - Core: Console target now writes single-lines only. Thanks @lust4life, @haf
- Core: Literate console target is much better off with improvements across the board, thanks @adamchester
- Core: Logary targets are now restarted with a Supervisor, which doubles as a generic Hopac-job/alt supervisor. Thanks to @neoeinstein for the initial implementation, to @lust4life for integrating it and to @haf for testing and stabilising and bugfixing it.
- Core: Logary targets now have access to a
Will
abstraction, should they choose to crash. The will will be sent back to the target on reinstantiation. Thanks @haf - Core: Logary targets can now specify a
Policy
of how they should be restarted on failure. By default (createSimple
used), they are restarted with exponential backoff, forever. - Core: How
Rule
works has been changed, see #274 (comment) - Core: Logary is now dual licensed to promote real open source projects and contributors to them. See https://github.com/logary/logary/blob/master/LICENSE.md
- Core: Added license-check on start
- Core: FsFormatting and JSON formatting now does cyclic reference tracking.
- Core: Added Codec concept, which takes either a string or a chunk of a byte array and converts it to a Message. Thanks @haf and to @tradera for sponsoring this change.
- Core: Added these codecs:
plain
(straight toMessage.value
),json
(destructures to Message with a best-effort analysis of the contents),binary
(for FsPickler based inputs) andlog4jXML
(from https://github.com/apache/logging-log4net/blob/master/src/Layout/XmlLayoutSchemaLog4j.cs appenders with https://logging.apache.org/log4net/release/howto/chainsaw.html), thanks @haf Also see the Rutta section below for details about these. - Config: Support for custom JSON formatters, thanks @lust4life, @haf
- Config: Support for custom Literate destructurers, projectors, thanks @lust4life
- Config: Support for URI-based configuration of targets, see
Logary.Configuration.Uri
, thanks @haf - Metrics: New method for tick-based metrics—see examples. Thanks @lust4life
- Metrics: Added methods for timing Jobs and Alts, thanks @haf
- Metrics: Support pretty-printing gauges like
2.3 days
or1.616 µs
, thanks @haf - Metrics: The new Processing feature (@lust4life) together with
Reservoirs
andSnapshot
values (@haf) lets you create histograms in Logary, on the fly. - Facade: Bump to v3 with Gauge containing
float
. - Build: Move to FAKE, remove Albacore, thanks @haf
- Build: Run all targets' tests as part of build, thanks @haf
- Docs: README has been mostly updated to the new API, thanks @lust4life, @haf
- Docs: README now has support for letting Logary remember the last N messages and batch-sending all remembered message to M targets upon a trigger, like getting an
Error
message. - Docs: Samples have been updated to the new API, thanks @lust4life, @haf
- Targets: The StackDriver target has been rewritten, bumped to latest versions of the SDK and has gotten batching added. Thanks to @tradera for sponsoring this change and @haf for implementing it.
- Targets: The InfluxDB target has been rewritten and has a leaner and meaner mapping from the new
Message
structure of Logary into tags (from context values, Logary tags) and fields (from gauges, and fields). It will now default to thevalue={..}
syntax if you log a single gauge, with the logger + gauge as the measurement name. If you log multiple gauges, each gauge is put as a separate field value and the measurement is your logger's name. Furthermore, gauges are also formatted when sent. For the full specification, please see https://github.com/logary/logary/blob/master/src/targets/Logary.Targets.InfluxDb/Targets_InfluxDb.fs#L143 (undernameGauges
), thanks @haf. - Targets: All targets have been upgraded to their latest versions of their respective libraries. This includes HTTP.fs—HTTP-based targets have been updated to use the compositional/filter-based approach to composing HTTP requests. Thanks @haf See https://github.com/logary/logary/blob/master/src/targets/Logary.Targets.OpsGenie/Targets_OpsGenie.fs#L277 for an example
- Targets: I (@haf/@logibit) have open sourced the Mixpanel and OpsGenie targets and updated their implementations to be even better, including batch-processing of messages: however, they are still licenced commercially no matter where they are running. Be honest now, dear user!
- Rutta: Added Argu and commands for easier usage and AppSettings-based configuration, thanks @haf, @tradera
- Rutta: Fix TopShelf API to be style-ideomatic, thanks @haf, @tradera
- Rutta: Added UDP ingestion, thanks @haf, @tradera
- Rutta: Added HTTP ingestion, thanks @haf, @tradera
- Rutta: Added ZMQ STREAM/TCP ingestion, thanks @haf, @tradera
- Rutta: Added support for spawning multiple listeners, thanks @haf, @tradera
- Rutta: Added support for specifying a codec for each listener. All of the above can now look like this to spawn a few different listeners, codecs and ingestion methods, together with the URI-based config improvement:
rutta.exe router --listener tcp 127.0.0.1:20001 json --listener tcp 127.0.0.1:20004 log4jxml --listener udp 127.0.0.1:20005 plain --target console://./ --target stackdriver://google/?projectId=my-project --verbose
In effect, this means you can run Rutta as a side-car to e.g. a docker container, in e.g. UDP mode, thereby increasing stability and letting non-.Net services, or C# services log into Logary and its targets. In the above case, we can configure the UDP output appender from log4net and have Rutta ingest that and either: send it to a target (the router command), proxy to another rutta instance (the proxy command) or poll system metrics or other persistent gauges where it is running (the shipper command). Thanks to @haf for coding and @tradera for sponsoring. - C# API and C# Facade: Carries over from v4. Thanks to Lynx Asset Management for sponsoring it.