账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Django的ORM如何把不同APP的SQL日志写到不同的文件中?
    71
    0
    目前的配置方式好像只能把所有的 sql 语句都写到一起是吗?LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, }}甚至更进一步,把 CRUD 的四种 sql 都写到不同的文件中
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 川长思鸟来 普通会员 1楼

      在Django中,你可以使用django.db.models模块的LogManager类来实现将不同APP的SQL日志写到不同的文件中的功能。以下是一个基本的示例,假设你有两个APP:app1app2,每个APP都有自己的SQL日志表,app1.logapp2.log

      首先,你需要在settings.py文件中定义两个LOGGING配置项,如下所示:

      python LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'console_format': { 'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s', 'datefmt': '%Y-%m-%d %H:%M:%S', }, 'log_file_format': { 'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s', 'datefmt': '%Y-%m-%d %H:%M:%S', 'filename': 'app1.log', }, }, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'console_format', }, 'log_file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': 'app1.log', 'encoding': 'utf-8', }, }, 'loggers': { 'app1': { 'level': 'DEBUG', 'handlers': ['console'], 'root': 'app1', }, 'app2': { 'level': 'DEBUG', 'handlers': ['log_file'], 'root': 'app2', }, }, }

      然后,在models.py文件中,你需要创建两个不同的模型类,每个模型代表一个APP的SQL日志,如下所示:

      ```python from django.db import models

      class Log(models.Model): app_name = models.CharField(max_length=100, unique=True) log_date = models.DateTimeField(auto_now_add=True) message = models.TextField()

      class Meta:
          db_table = 'app_log'
          verbose_name = 'Log'
          verbose_name_plural = 'Logs'
      

      创建一个App1的Log模型

      app1_log = Log.objects.create(app_name='app1', log_date='2022-01-01 00:00:00', message='This is the log for app1.')

      创建一个App2的Log模型

      app2_log = Log.objects.create(app_name='app2', log_date='2022-01-02 00:00:00', message='This is the log for app2.') ```

      urls.py文件中,你需要定义两个URL路径,一个用于加载和显示APP1的SQL日志,另一个用于加载和显示APP2的SQL日志:

      ```python from django.urls import path

      app1_urls = [ path('app1/', views.App1Logs.as_view(), name='app1_logs'), ]

      app2_urls = [ path('app2/', views.App2Logs.as_view(), name='app2_logs'), ] ```

      views.py文件中,你可以创建一个App1Logs视图,该视图将从app1.log文件中读取数据,并将它们以JSON格式返回:

      ```python from django.shortcuts import render from .models import Log

      def App1Logs(request): app_logs = Log.objects.filter(app_name='app1') return render(request, 'app1_logs.html', {'app_logs': app_logs}) ```

      app1_logs.html文件中,你可以显示APP1的SQL日志:

      html {% for log in app_logs %} <div class="log"> <h2>{{ log.app_name }}</h2> <p>{{ log.log_date }}</p> <p>{{ log.message }}</p> </div> {% endfor %}

      同样,在app2_logs.html文件中,你可以显示APP2的SQL日志:

      html {% for log in app_logs %} <div class="log"> <h2>{{ log.app_name }}</h2> <p>{{ log.log_date }}</p> <p>{{ log.message }}</p> </div> {% endfor %}

      最后,你需要在urls.py文件中定义一个URL路由,用于从app1_logsapp2_logsURL路径加载和显示不同的模板:

      ```python from django.urls import path

      urlpatterns = [ path('app1/', include(app1_urls)), path('app2/', include(app2_urls)), ] ```

      这样,当用户访问/app1/logs/app2/logsURL时,他们将看到两个不同的模板,每个模板代表一个APP的SQL日志。这就是如何在Django中将不同APP的SQL日志写到不同的文件中的基本实现。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部