de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 opensourcegeek
opensourcegeek
Question

Berubah secara dinamis tingkat log tanpa restart aplikasi

Adalah mungkin untuk mengubah tingkat log menggunakan fileConfig di python tanpa me-restart aplikasi. Jika hal ini tidak dapat dicapai melalui fileConfig ada beberapa cara lain untuk mendapatkan hasil yang sama?

Update: Ini adalah sebuah aplikasi yang berjalan pada server, saya ingin sys admin untuk dapat mengubah file konfigurasi yang akan diambil selama jangka waktu dengan aplikasi dan mengubah tingkat log secara dinamis. Saya bekerja dengan gevent pada saat itu maka saya've menambahkan kode saya sebagai salah satu jawaban yang menggunakan inotify untuk memilih perubahan pada file konfigurasi.

54 2013-10-27T11:07:41+00:00 7
 codeforester
codeforester
Pertanyaan edit 23 Mei 2019 в 7:22
Pemrograman
python
logging
gevent
Solution / Answer
Martijn Pieters
Martijn Pieters
27 Oktober 2013 в 11:09
2013-10-27T11:09:44+00:00
Lebih
Sumber
Sunting
#22633386

fileConfig adalah sebuah mekanisme untuk mengkonfigurasi tingkat log untuk anda berdasarkan file; anda dapat secara dinamis mengubah hal ini setiap waktu dalam program anda.

Call .setLevel() pada pendataan objek yang anda ingin mengubah tingkat log. Biasanya anda'a apa yang di root:

logging.getLogger().setLevel(logging.DEBUG)
98
0
 sfinkens
sfinkens
12 Oktober 2017 в 1:07
2017-10-12T13:07:23+00:00
Lebih
Sumber
Sunting
#22633391

Selain diterima jawaban: Tergantung pada bagaimana anda diinisialisasi logger, anda mungkin juga harus memperbarui logger's handler:

import logging

level = logging.DEBUG
logger = logging.getLogger()
logger.setLevel(level)
for handler in logger.handlers:
    handler.setLevel(level)
13
0
Vinay Sajip
Vinay Sajip
27 Oktober 2013 в 11:15
2013-10-27T11:15:19+00:00
Lebih
Sumber
Sunting
#22633388

Hal ini tentu saja mungkin untuk menggunakan fileConfig() untuk mengubah konfigurasi penebangan on the fly, meskipun untuk perubahan sederhana pendekatan program seperti yang disarankan di Martijn Pieters' jawaban yang mungkin akan sesuai. Penebangan bahkan menyediakan socket server untuk mendengarkan perubahan konfigurasi menggunakan listen() / stopListening() Api, seperti yang didokumentasikan di sini. Untuk mendapatkan login untuk mendengarkan pada port tertentu, anda menggunakan

t = logging.config.listen(PORT_NUMBER)
t.start()

dan untuk berhenti mendengarkan panggilan

logging.config.stopListening()

Untuk mengirim data ke server, anda dapat menggunakan misalnya

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', PORT_NUMBER))
with open(CONFIG_FILE) as f:
    data_to_send = f.read()
s.send(struct.pack('>L', len(data_to_send)))
s.send(data_to_send)
s.close()

Update: Karena untuk mundur kompatibilitas kendala, internal pelaksanaan fileConfig() call berarti bahwa anda dapat't menentukan disable_existing_loggers=False dalam panggilan, yang membuat fitur ini kurang berguna dalam skenario tertentu. Anda dapat menggunakan API untuk mengirim file JSON menggunakan dictConfig skema, yang akan memungkinkan kontrol yang lebih baik atas rekonfigurasi. Hal ini membutuhkan Python 2.7/3.2 atau di atas (di mana dictConfig() ditambahkan). Atau, anda dapat menggunakan stdlib kode untuk menerapkan sendiri pendengar yang bekerja dalam cara yang sama tetapi yang disesuaikan untuk kebutuhan spesifik anda.

Vinay Sajip
Vinay Sajip
Jawaban edit 27 Oktober 2013 в 1:20
6
0
 DrOffler
DrOffler
27 Agustus 2019 в 10:30
2019-08-27T10:30:53+00:00
Lebih
Sumber
Sunting
#22633392

Memperluas pada sfinken's jawaban, dan Starman's berikutnya komentar, anda juga dapat memeriksa jenis handler untuk target tertentu outputter - misalnya:

impor logging logger = logging.getLogger() untuk handler di logger.penangan: jika isinstance(handler, jenis(logging.StreamHandler())): handler.setLevel(logging.DEBUG) logger.debug('Debug logging diaktifkan')

2
0
Rolando Max
Rolando Max
27 Oktober 2013 в 11:11
2013-10-27T11:11:32+00:00
Lebih
Sumber
Sunting
#22633387

Mungkin ini yang anda cari:

import logging
logging.getLogger().setLevel(logging.INFO)

Perhatikan bahwa `getLogger () dipanggil tanpa argumen mengembalikan akar logger.

Jonas Byström
Jonas Byström
Jawaban edit 17 Agustus 2017 в 6:38
2
0
 opensourcegeek
opensourcegeek
24 November 2013 в 5:03
2013-11-24T17:03:30+00:00
Lebih
Sumber
Sunting
#22633390

Saya akhirnya menetap dengan menggunakan inotify dan gevent untuk memeriksa file menulis operasi, dan setelah saya tahu file yang telah diubah, maka aku pergi dan mengatur tingkat untuk setiap logger saya telah didasarkan pada config.

import gevent
import gevent_inotifyx as inotify
from gevent.queue import Queue

class FileChangeEventProducer(gevent.Greenlet):
    def __init__(self, fd, queue):
        gevent.Greenlet.__init__(self)
        self.fd = fd
        self.queue = queue

    def _run(self):
        while True:
            events = inotify.get_events(self.fd)
            for event in events:
                self.queue.put(event)
                gevent.sleep(0)

class FileChangeEventConsumer(gevent.Greenlet):
    def __init__(self, queue, callBack):
        gevent.Greenlet.__init__(self)
        self.queue = queue
        self.callback = callBack

    def _run(self):
        while True:
            _ = self.queue.get()
            self.callback()
            gevent.sleep(0)

class GeventManagedFileChangeNotifier:
    def __init__(self, fileLocation, callBack):
        self.fileLocation = fileLocation
        self.callBack = callBack
        self.queue = Queue()
        self.fd = inotify.init()
        self.wd = inotify.add_watch(self.fd, self.fileLocation, inotify.IN_CLOSE_WRITE)

    def start(self):
        producer = FileChangeEventProducer(self.fd, self.queue)
        producer.start()
        consumer = FileChangeEventConsumer(self.queue, self.callBack)
        consumer.start()
        return (producer, consumer)

Kode di atas akan digunakan seperti di bawah ini,

    def _setUpLoggingConfigFileChangeNotifier(self):
        loggingFileNameWithFullPath = self._getFullPathForLoggingConfig()
        self.gFsNotifier = GeventManagedFileChangeNotifier(loggingFileNameWithFullPath, self._onLogConfigChanged)
        self.fsEventProducer, self.fsEventConsumer = self.gFsNotifier.start()

    def _onLogConfigChanged(self):
        self.rootLogger.info('Log file config has changed - examining the changes')
        newLoggingConfig = Config(self.resourcesDirectory, [self.loggingConfigFileName]).config.get('LOG')
        self.logHandler.onLoggingConfigChanged(newLoggingConfig)

Setelah saya baru log file config yang saya dapat kawat di kanan penebangan tingkat untuk setiap logger dari config. Saya hanya ingin berbagi jawaban dan itu mungkin membantu seseorang jika mereka mencoba untuk menggunakannya dengan gevent.

2
0
 Mihai
Mihai
27 Oktober 2013 в 12:29
2013-10-27T12:29:26+00:00
Lebih
Sumber
Sunting
#22633389

Tergantung pada aplikasi anda, anda harus terlebih dahulu menemukan cara untuk reload file atau mengatur ulang tingkat log didasarkan pada file konfigurasi anda sendiri selama eksekusi.

Cara termudah adalah dengan menggunakan timer. Baik menggunakan threading untuk melakukan itu, atau membuat anda async kerangka kerja untuk melakukan itu (jika anda menggunakan salah; mereka biasanya melakukan hal ini).

Menggunakan threading.Timer:

import threading
import time

def reset_level():
    # you can reload your own config file or use logging.config.fileConfig here
    print 'Something else'
    pass

t = threading.Timer(10, reset_level)
t.start()

while True:
    # your app code
    print 'Test'
    time.sleep(2)

Output:

Test
Test
Test
Test
Test
Something else
Test
Test

Update: Silahkan periksa solusi yang diusulkan oleh Martijn Pieters.

 Mihai
Mihai
Jawaban edit 11 Juni 2015 в 2:09
0
0
Related communities 6
Python Indonesia
Python Indonesia
24 686 pengguna
Programmer Python Indonesia. Group ini dikelola oleh sejumlah admin. Baca pesan tersemat / pinned message: https://t.me/pythonID/217588
Buka telegram
Indonesian Python Warriors
Indonesian Python Warriors
1 462 pengguna
Di grup ini tidak ada kewajiban untuk menggunakan username dan foto. Yang tidak boleh adalah spamming. Gak boleh baper, kalau nanya yang bener, eror jangan difoto pake HP, gunakan screenshot, code copas ke pastebin.com lalu share link ke sini.
Buka telegram
Python-ID Jogja
Python-ID Jogja
962 pengguna
Buka telegram
BASIC PYTHON INDONESIA
BASIC PYTHON INDONESIA
214 pengguna
Buka telegram
Python Newbie Indonesia
Python Newbie Indonesia
180 pengguna
Peraturan grup Python Newbie 🌻Dilarang spam 🌻Dilarang menggunakan bahasa kasar 🌻Dilarang beriklan di grup tanpa seizin admin Beberapa video dasar python dapat diliat melalui channel youtube juan aditya Jangan lupa untuk subscribe ya🙏
Buka telegram
PythonWealth Indonesia 🇮🇩
PythonWealth Indonesia 🇮🇩
29 pengguna
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 6 jam yang lalu
2
Akshit Mehta
Terdaftar 2 hari yang lalu
3
me you
Terdaftar 5 hari yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi