Я наследую и переопределяю RotatingFileHandler
обработчика ведения журнала python.
Значение RotatingFileHandler имеет значение self.baseFilename
, обработчик будет использовать self.baseFilename
для создания logFile. (когда он создает файл первым или когда происходит опрокидывание )
self.shouldRollover()
method, Он проверяет, должен ли обработчик листать файл журнала опроса или нет.
Если этот метод return 1
, это означает, что произойдет опрокидывание или return 0
.
. Заменяя их, я определяю, когда этот обработчик выполняет опрокидывание и какое имя должно использоваться для нового файла журнала путем опрокидывания.
----------- ------------------------------Редактировать------------------- ----------------------
Я отправляю код примера.
from logging import handlers
class DailyRotatingFileHandler(handlers.RotatingFileHandler):
def __init__(self, alias, basedir, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0):
"""
@summary:
Set self.baseFilename to date string of today.
The handler create logFile named self.baseFilename
"""
self.basedir_ = basedir
self.alias_ = alias
self.baseFilename = self.getBaseFilename()
handlers.RotatingFileHandler.__init__(self, self.baseFilename, mode, maxBytes, backupCount, encoding, delay)
def getBaseFilename(self):
"""
@summary: Return logFile name string formatted to "today.log.alias"
"""
self.today_ = datetime.date.today()
basename_ = self.today_.strftime("%Y-%m-%d") + ".log" + '.' + self.alias_
return os.path.join(self.basedir_, basename_)
def shouldRollover(self, record):
"""
@summary:
Rollover happen
1. When the logFile size is get over maxBytes.
2. When date is changed.
@see: BaseRotatingHandler.emit
"""
if self.stream is None:
self.stream = self._open()
if self.maxBytes > 0 :
msg = "%s\n" % self.format(record)
self.stream.seek(0, 2)
if self.stream.tell() + len(msg) >= self.maxBytes:
return 1
if self.today_ != datetime.date.today():
self.baseFilename = self.getBaseFilename()
return 1
return 0
Это DailyRotatingFileHandler создаст файл журнала, например
2016-10-05.log.alias
2016-10-05.log.alias.1
2016-10-05.log.alias.2
2016-10-06.log.alias
2016-10-06.log.alias.1
2016-10-07.log.alias.1
предположим, что строка: @ "200" адрес указателя: 0xeeff @ "100" адрес указателя: 0xeeaa
, поэтому ваш код может измениться следующим образом:
NSString *johnsMoney = @"200";
(johnsMoney = 0xeeff)
NSString *marysMoney = johnsMoney;
(marysMoney = 0xeeff)
johnsMoney = @"100";
(johnsMoney = 0xeeaa)
(marysMoney = 0xeeff)
marysMoney адрес указателя не изменен, но адрес указателя johnsMoney изменился.
Как то же: предположим, что объект: адрес указателя dog1: 0xeeff
, поэтому ваш код может измениться следующим образом:
Dog *dog1 = [[Dog alloc] init];
(dog1 pointer address: 0xeeff)
dog1.name = @"Dog 1";
Dog *dog2 = dog1;
(dog2 pointer address: 0xeeff)
dog1.name = @"Dog 3";
(dog1 pointer address still: 0xeeff)
(dog2 pointer address still: 0xeeff)
Поскольку все они указывают на один и тот же адрес, оба они изменились.
Нет. Помните, что вы имеете дело с указателями. Итак, когда вы делаете
johnsMoney = @"100";
Вы устанавливаете указатель johnsMoney
на другой адрес памяти, который содержит значение @"100"
. marysMoney
по-прежнему указывает на исходный адрес со значением @"200"
.
johnsMoney
и marysMoney
являются указателями на строки .
Когда вы пишете johnsMoney = @"100"
, теперь он указывает на другую строку. Это не меняет marysMoney
, который все еще указывает на исходную строку.
Если вы использовали NSMutableString
, а вы [johnsMoney setString:@"100"]
, то это изменило бы базовые данные (к которым обе переменные все равно будет указывать).
В вашем примере локальная переменная marysMoney
поддерживает сильную ссылку на исходный объект johnsMoney
. Когда свойство johnsMoney
изменено, свойство больше не сохраняет сильную ссылку на исходное значение, но это значение все еще поддерживается сильной переменной marysMoney
.
@ "200" является объектной записью для объекта NSString. У него будет собственное пространство памяти, и johnsmoney укажет на него. Итак, marysmoney никогда не указывает на johnsmoney.
Что на самом деле происходит, это ...
Johns Money 200 // pointer 1
Marys Money 200 // pointer 1
Johns Money 100 // pointer 2
Marys Money 200 // pointer 1
johnsmoney указывает на @ "200". marysmoney также указывает на «200». Когда johnsmoney назначается @ «100», johnsmoney указывает на «100». Пока marysmoney все еще указывает на @ "200".
Это не ссылки. Это указатели объектов. Если две переменные указывают на один и тот же объект, изменение одного указателя на другой объект не влияет на другой указатель.
Подумайте о двух людях, стоящих рядом друг с другом. Оба протягивают руку и указывают на тот же стол. Теперь один человек поворачивается и указывает на стул. Другой человек не пострадал. Они все еще указывают на таблицу.
просто.
NSString *johnsMoney = @"200";
//here johnsMoney is declared as NSString, so it will be string type.
//any thing given inside @"" will be considered as string.
//currently, johnsMoney contains 200.
NSString *marysMoney = johnsMoney;
//here marysMoney is declared as NSString, so it will be string type.
//johnsMoney is already a string. therefore, marysMoney automatically reads the
//string in johnsMoney. so currently, marysMoney will also be 200.
NSLog(@"Johns Money %@",johnsMoney);
NSLog(@"Marys Money %@",marysMoney);
//both will be printed as 200. right?
johnsMoney = @"100";
//now johnsMoney reassigned as 100.
//but still marysMoney is 200.
//there is nothing written for changing maryMoney from 200.
NSLog(@"Johns Money %@",johnsMoney);
NSLog(@"Marys Money %@",marysMoney);
, поэтому я думаю, что у вас это есть. Я не хочу думать об этом сложным образом, включая указатели.
Note:if any one feels that it is rubbish, kindly please avoid my answer. am sorry to post it. i just only vomited the pointer concept. i don't know how much correct is my answer.