Logging modülü türkçe karakter sorunu

Merhaba;
Logging modülünü kullanırken türkçe karakter sorunu yaşıyorum.Örneğin;

import logging as log
log.basicConfig(filename="logs.log", level=log.DEBUG)
log.info("ğğğğüüüüççç türkçe")

Kodlarını bir dosyaya kaydettim ve çalıştırdım. logs.log isimli dosyaya baktığımda;

INFO:root:����������� t�rk�e

satırlarını görüyorum. Pycharm da bu dosyanın utf-8 karakter kodlama biçimini kullanmadığından yakınıyor. Bu sorunu nasıl çözebilirim?

Betiğin başına -*- coding: utf-8 -*- yazınca da aynı sorun oluşuyor mu? Mesela bende bir sorun oluşmadı.

1 Beğeni

:astonished: ben bunu nasıl düşünemedim…
Bazen ilk aklıma gelecek çözüm en son aklıma geliyor :rofl:
Evet bu işe yarıyor
Python3 çıktı kurtuldum diyordum şu -*- coding: utf-8 -*- kodundan yine çıktı karşıma
Teşekkür ederim

Rica ederim. Ya onda ne var sanki. Bir satırlık bir encoding kodu. Yazın gitsin. :slight_smile: Neyse kolay gelsin.

1 Beğeni

Nedendir bilmiyorum da, ben de hiç sevmemiştim o encoding satırını. Sanki kodların başında olunca uzaydan gelmiş gibi hissettiriyordu :smile:

Zaten bu hızla globalleşen ve gelişmiş depolama teknolojilerinin olduğu bir dünyada neden UTF-8 standart olarak kullanılmaz ben anlayabilmiş değilim.

1 Beğeni

:rofl:

Evet. Her ne kadar bilgisayar amerika’da ortaya çıksa da artık dünyanın her yerinde bilgisayarlar var. Bu ASCII köklü bir değişim yapılarak kaldırılmalı bence.

1 Beğeni

Aslında bu hatayı bildirmek lazım. İngilizce bilen birisi bu sorunu geliştiricilere bildirirse güzel olur.

Kesinlikle oyle.

Dosya encoding’ini belirtiyor olmasi lazim; 3’te belirtilmeyen dosyalar UTF-8 sayildigi icin sorun cikmamasi lazim.

Burada cikan sorunu cozdugune gore ya kaynak dosyasi UTF-8 degil, ya da bu satir kaynak dosyasi encoding’inden fazlasini degistiriyor.

locale.getpreferredencoding() ne donduruyor? Bu satir varken ve yokken ayni mi?

Hata oldugundan emin degilim. Windows, UTF-8 locale’lerini pek sevmiyor.

Kaynak dosyasinin UTF-8 oldugundan emin miyiz? (Hex dump iyi olur)
Bir de su getpreferredencoding’in ciktisini incelemek lazim.

Hakikaten hata varsa raporlayabilirim, hatta raporlayana kadar duzelte-de-bilirim.

Evet. Az önce Windows’ta aşağıdaki kodları çalıştırdım:

import logging as log
log.basicConfig(filename="logs.log", level=log.DEBUG)
log.info("türkçe")

Ve bir sorun oluşmadı:

INFO:root:türkçe

O zaman neden sorun oluşmuş acaba? O zaman ASCII dosya kullandığımı sanmıyorum. Belki de logging modülüne bakmak gerekiyordur?

cp1254 çıktısı verdi.

logging modülüne bir bakayım…

Windows’taki Notepad’in karakter kodlaması default olarak ansi’dir. Windows’a gedit’i kurun mesela. Sonra kodlarınızı geditte açılan sayfaya yazın ve dosyayı kaydetmeye çalışın, göreceksiniz ki dosya kodlamasında otomatik olarak utf-8 yazacaktır. Belki başka metin editörlerinde de dosyalar otomatik olarak utf-8 karakter kodlamasıyla kaydediliyordur, bilemiyorum.

logging modülünün __init__.py dosyasındaki 1738’inci satırda başlayan basicConfig(**kwargs) fonksiyonu, 1008’inci satırda başlayan FileHandler sınıfı ile ilişkili.

FileHandler sınıfındaki __init__ fonksiyonunun encoding argümanı None olarak belirtilmiş.

class FileHandler(StreamHandler):
    """
    A handler class which writes formatted logging records to disk files.
    """
    def __init__(self, filename, mode='a', encoding=None, delay=False):

1806’ncı satırda yer alan, basicConfig(**kwargs) fonksiyonu içindeki aşağıdaki kod yerine,

                    h = FileHandler(filename, mode)

aşağıdakini yazarsanız;

                    h = FileHandler(filename, mode, encoding="utf-8")

ve dosyayı kaydedip çıkarsanız, bundan sonraki log dosyalarının kodlaması otomatik olarak utf-8 olacaktır.

Veya FileHandler sınıfının __init__ fonksiyonunun encoding argümanına "utf-8" yazılabilir.

1 Beğeni

Selamlar Kodun çözümü.

logging.basicConfig(filename='kayit_gunlugu.log', level=logging.INFO,encoding="utf-8")