log-foundry 0.10.2.dev56__tar.gz → 0.10.2.dev58__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/PKG-INFO +15 -1
  2. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/README.md +14 -0
  3. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/pyproject.toml +1 -1
  4. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/LICENSE +0 -0
  5. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/__init__.py +0 -0
  6. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/_diag.py +0 -0
  7. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/_fork.py +0 -0
  8. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/_lifecycle.py +0 -0
  9. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/api.py +0 -0
  10. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/config.py +0 -0
  11. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/console.py +0 -0
  12. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/context.py +0 -0
  13. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/decorator.py +0 -0
  14. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/ids.py +0 -0
  15. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/model.py +0 -0
  16. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/py.typed +0 -0
  17. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/results.py +0 -0
  18. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sanitize.py +0 -0
  19. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/__init__.py +0 -0
  20. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/_batch.py +0 -0
  21. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/_chunk.py +0 -0
  22. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/_retry.py +0 -0
  23. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/_socket.py +0 -0
  24. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/_time.py +0 -0
  25. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/base.py +0 -0
  26. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/callback.py +0 -0
  27. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/clickhouse.py +0 -0
  28. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/datadog.py +0 -0
  29. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/elasticsearch.py +0 -0
  30. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/eventhubs.py +0 -0
  31. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/file.py +0 -0
  32. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/filtering.py +0 -0
  33. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/firehose.py +0 -0
  34. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/honeycomb.py +0 -0
  35. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/http.py +0 -0
  36. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/kafka.py +0 -0
  37. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/kinesis.py +0 -0
  38. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/logging_sink.py +0 -0
  39. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/logstash.py +0 -0
  40. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/loki.py +0 -0
  41. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/memory.py +0 -0
  42. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/mongodb.py +0 -0
  43. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/multi.py +0 -0
  44. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/nats.py +0 -0
  45. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/newrelic.py +0 -0
  46. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/null.py +0 -0
  47. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/postgres.py +0 -0
  48. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/pubsub.py +0 -0
  49. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/rabbitmq.py +0 -0
  50. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/redis.py +0 -0
  51. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/sentry.py +0 -0
  52. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/sns.py +0 -0
  53. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/splunk.py +0 -0
  54. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/sqlite.py +0 -0
  55. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/sqs.py +0 -0
  56. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/stdout.py +0 -0
  57. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/syslog.py +0 -0
  58. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/sinks/transform.py +0 -0
  59. {log_foundry-0.10.2.dev56 → log_foundry-0.10.2.dev58}/src/log_foundry/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: log-foundry
3
- Version: 0.10.2.dev56
3
+ Version: 0.10.2.dev58
4
4
  Summary: Generate logs for your console and JSON events for downstream consumption.
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -525,6 +525,20 @@ A few conventions hold across every sink below:
525
525
  The tables show the destination-defining arguments only; sinks that retry also take `max_retries`.
526
526
  - **Ownership.** A resource the sink opens itself is closed on `shutdown()`; an injected one is left
527
527
  open for you to manage.
528
+ - **Forking.** A forked child repairs the library automatically — it rebuilds the worker so it keeps
529
+ delivering, re-initialises every lock (without which the child's *first* log call can deadlock),
530
+ and throws away any buffered bytes it inherited so they are not written twice. What it does **not**
531
+ do is give the child a sink of its own: the child inherits the same object, so one socket, one
532
+ SQLite handle or one file is now written by two processes — and *closed* by both, each at its own
533
+ exit. That is fine for an append-only file or a queue client and wrong for a connection with
534
+ transaction scope, where a close is protocol-visible. **Under gunicorn, uWSGI or Celery, build a
535
+ connection-holding sink only in the worker process** — `configure()` from gunicorn's `post_fork`
536
+ hook, never under preload, and don't log from the master. Reconfiguring in the child is *not* the
537
+ remedy and is worse than the problem: `configure(sink=...)` closes the sink it replaces, which
538
+ there is the parent's live connection. A master that must log should use a sink whose `close()`
539
+ costs nothing to share, such as `StdoutSink` or `FileSink`. A sink you wrote yourself is repaired
540
+ only if it subclasses `Sink` or a shipped sink; one that satisfies the protocol structurally is
541
+ outside the repair, along with any third-party client's own locks and buffers.
528
542
  - **Never crashes the app.** A broken destination degrades logging and nothing more. A sink that
529
543
  delivered *part* of a batch counts what it lost (`.failed`, `.dropped_oversized`,
530
544
  `.dropped_unadjudicated`, …) and returns, since retrying would re-deliver what already landed.
@@ -489,6 +489,20 @@ A few conventions hold across every sink below:
489
489
  The tables show the destination-defining arguments only; sinks that retry also take `max_retries`.
490
490
  - **Ownership.** A resource the sink opens itself is closed on `shutdown()`; an injected one is left
491
491
  open for you to manage.
492
+ - **Forking.** A forked child repairs the library automatically — it rebuilds the worker so it keeps
493
+ delivering, re-initialises every lock (without which the child's *first* log call can deadlock),
494
+ and throws away any buffered bytes it inherited so they are not written twice. What it does **not**
495
+ do is give the child a sink of its own: the child inherits the same object, so one socket, one
496
+ SQLite handle or one file is now written by two processes — and *closed* by both, each at its own
497
+ exit. That is fine for an append-only file or a queue client and wrong for a connection with
498
+ transaction scope, where a close is protocol-visible. **Under gunicorn, uWSGI or Celery, build a
499
+ connection-holding sink only in the worker process** — `configure()` from gunicorn's `post_fork`
500
+ hook, never under preload, and don't log from the master. Reconfiguring in the child is *not* the
501
+ remedy and is worse than the problem: `configure(sink=...)` closes the sink it replaces, which
502
+ there is the parent's live connection. A master that must log should use a sink whose `close()`
503
+ costs nothing to share, such as `StdoutSink` or `FileSink`. A sink you wrote yourself is repaired
504
+ only if it subclasses `Sink` or a shipped sink; one that satisfies the protocol structurally is
505
+ outside the repair, along with any third-party client's own locks and buffers.
492
506
  - **Never crashes the app.** A broken destination degrades logging and nothing more. A sink that
493
507
  delivered *part* of a batch counts what it lost (`.failed`, `.dropped_oversized`,
494
508
  `.dropped_unadjudicated`, …) and returns, since retrying would re-deliver what already landed.
@@ -20,7 +20,7 @@ dependencies = [
20
20
  ]
21
21
 
22
22
  # Optional features. Install with: pip install log-foundry[aws]
23
- version = "0.10.2.dev56"
23
+ version = "0.10.2.dev58"
24
24
 
25
25
  [project.optional-dependencies]
26
26
  aws = ["boto3>=1.43.61"] # SQSSink, SNSSink, KinesisSink, FirehoseSink