c2cwsgiutils 6.2.0.dev375__tar.gz → 6.2.0.dev376__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 (67) hide show
  1. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/PKG-INFO +1 -1
  2. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/sqlalchemylogger/README.md +30 -0
  3. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/sqlalchemylogger/handlers.py +24 -0
  4. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/pyproject.toml +1 -1
  5. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/LICENSE +0 -0
  6. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/README.md +0 -0
  7. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/__init__.py +0 -0
  8. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/acceptance/__init__.py +0 -0
  9. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/acceptance/connection.py +0 -0
  10. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/acceptance/image.py +0 -0
  11. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/acceptance/package-lock.json +0 -0
  12. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/acceptance/package.json +0 -0
  13. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/acceptance/print.py +0 -0
  14. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/acceptance/screenshot.js +0 -0
  15. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/acceptance/utils.py +0 -0
  16. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/auth.py +0 -0
  17. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/broadcast/__init__.py +0 -0
  18. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/broadcast/interface.py +0 -0
  19. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/broadcast/local.py +0 -0
  20. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/broadcast/redis.py +0 -0
  21. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/broadcast/utils.py +0 -0
  22. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/client_info.py +0 -0
  23. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/config_utils.py +0 -0
  24. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/coverage_setup.py +0 -0
  25. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/db.py +0 -0
  26. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/db_maintenance_view.py +0 -0
  27. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/debug/__init__.py +0 -0
  28. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/debug/_listeners.py +0 -0
  29. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/debug/_views.py +0 -0
  30. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/debug/utils.py +0 -0
  31. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/errors.py +0 -0
  32. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/health_check.py +0 -0
  33. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/index.py +0 -0
  34. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/loader.py +0 -0
  35. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/logging_view.py +0 -0
  36. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/models_graph.py +0 -0
  37. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/pretty_json.py +0 -0
  38. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/profiler.py +0 -0
  39. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/prometheus.py +0 -0
  40. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/py.typed +0 -0
  41. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/pyramid.py +0 -0
  42. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/pyramid_logging.py +0 -0
  43. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/redis_stats.py +0 -0
  44. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/redis_utils.py +0 -0
  45. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/request_tracking/__init__.py +0 -0
  46. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/request_tracking/_sql.py +0 -0
  47. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/scripts/__init__.py +0 -0
  48. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/scripts/genversion.py +0 -0
  49. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/scripts/stats_db.py +0 -0
  50. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/scripts/test_print.py +0 -0
  51. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/sentry.py +0 -0
  52. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/services.py +0 -0
  53. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/setup_process.py +0 -0
  54. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/sql_profiler/__init__.py +0 -0
  55. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/sql_profiler/_impl.py +0 -0
  56. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/sqlalchemylogger/__init__.py +0 -0
  57. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/sqlalchemylogger/_filters.py +0 -0
  58. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/sqlalchemylogger/_models.py +0 -0
  59. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/sqlalchemylogger/examples/__init__.py +0 -0
  60. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/sqlalchemylogger/examples/example.py +0 -0
  61. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/static/favicon-16x16.png +0 -0
  62. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/static/favicon-32x32.png +0 -0
  63. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/stats_pyramid/__init__.py +0 -0
  64. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/stats_pyramid/_db_spy.py +0 -0
  65. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/stats_pyramid/_pyramid_spy.py +0 -0
  66. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/templates/index.html.mako +0 -0
  67. {c2cwsgiutils-6.2.0.dev375 → c2cwsgiutils-6.2.0.dev376}/c2cwsgiutils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: c2cwsgiutils
3
- Version: 6.2.0.dev375
3
+ Version: 6.2.0.dev376
4
4
  Summary: Common utilities for Camptocamp WSGI applications
5
5
  License-Expression: BSD-2-Clause
6
6
  License-File: LICENSE
@@ -63,3 +63,33 @@ if __name__ == '__main__':
63
63
  # logs after a timeout
64
64
  time.sleep(2)
65
65
  ```
66
+
67
+ ## Use with forking server (ex: `gunicorn`)
68
+
69
+ Snippet for configuration with `gunicorn` and `paste`:
70
+
71
+ `production.ini`:
72
+
73
+ ```
74
+ [handler_sqlalchemylogger]
75
+ class = c2cwsgiutils.sqlalchemylogger.handlers.SQLAlchemyHandler
76
+ args = ({'url':'postgresql://','tablename':'logs','tableargs': {'schema':'logs'}, 'delay_startup': True},'healthcheck')
77
+ level = NOTSET
78
+ formatter = generic
79
+ propagate = 0
80
+ ```
81
+
82
+ `gunicorn.conf.py`:
83
+
84
+ ```python
85
+ def post_fork(server, worker):
86
+ import logging
87
+ logger = logging.getHandlerByName('sqlalchemylogger')
88
+ logger.start()
89
+ ```
90
+
91
+ The gunicorn must be started with this config file:
92
+
93
+ ```bash
94
+ gunicorn -c gunicorn.conf.py [...]
95
+ ```
@@ -36,6 +36,29 @@ class SQLAlchemyHandler(logging.Handler):
36
36
  ) -> None:
37
37
  """Initialize the SQLAlchemyHandler."""
38
38
  super().__init__()
39
+
40
+ self.started = False
41
+ if sqlalchemy_url.get("delay_startup", False):
42
+ self.sqlalchemy_url = sqlalchemy_url
43
+ self.does_not_contain_expression = does_not_contain_expression
44
+ self.contains_expression = contains_expression
45
+ else:
46
+ self._start(sqlalchemy_url, does_not_contain_expression, contains_expression)
47
+
48
+ def start(self) -> None:
49
+ """Force startup of logger in case of delayed startup."""
50
+ self._start(self.sqlalchemy_url, self.does_not_contain_expression, self.contains_expression)
51
+
52
+ def _start(
53
+ self,
54
+ sqlalchemy_url: dict[str, str],
55
+ does_not_contain_expression: str,
56
+ contains_expression: str,
57
+ ) -> None:
58
+ if self.started:
59
+ # only start once
60
+ return
61
+
39
62
  # Initialize DB session
40
63
  self.engine = create_engine(sqlalchemy_url["url"])
41
64
  self.Log = create_log_class( # pylint: disable=invalid-name
@@ -55,6 +78,7 @@ class SQLAlchemyHandler(logging.Handler):
55
78
  self.addFilter(DoesNotContainExpression(does_not_contain_expression))
56
79
  if contains_expression:
57
80
  self.addFilter(ContainsExpression(contains_expression))
81
+ self.started = True
58
82
 
59
83
  def _processor(self) -> None:
60
84
  _LOG.debug("%s: starting processor thread", __name__)
@@ -229,7 +229,7 @@ include = [
229
229
  ]
230
230
  requires-python = ">=3.11"
231
231
  dependencies = ["requests", "pyyaml", "ujson", "cee_syslog_handler", "prometheus-client", "setuptools<81.0.0"]
232
- version = "6.2.0.dev375"
232
+ version = "6.2.0.dev376"
233
233
 
234
234
  [project.urls]
235
235
  repository = "https://github.com/camptocamp/c2cwsgiutils"