Разное

Зап сахара: ЗАПАДНАЯ САХАРА • Большая российская энциклопедия

Западная Сахара — Teletype

Путевые заметки. День 4

Удивительно, но четвертый день экспедиции опять принес нам потери. На этот раз мы лишились лобового стекла. Если так пойдет дальше, то скоро мы лишимся Ловыгина. К этому, кстати, есть все предпосылки. Чем южнее мы едем, тем хищнее становятся взгляды местных женщин при виде Пети с килограммом серебряных перстней на руках. Ловыгин, кстати, называет себя нашим талисманом и отказывается садиться за руль. «Талисман, — говорит Ловыгин, — не должен рулить, он должен приносить удачу участникам автопробега!»

Пока, в рамках своей должности талисмана автопробега, Ловыгин придумал названия автомобилям экспедиции машины мы назвали «Крузенштерн» и «Беллинзгаузен». Позже было решено переименовать экипаж автомобиля «Крузенштерн» в «Крузенштерн-Реснянский», в честь нашего оператора Александра Реснянского. Господин Реснянский у нас не просто оператор, он настоящий человек-пароход! Целыми днями он снимает и самостоятельно монтирует видео! Он отлично готовит и делает всю работу по палаточному лагерю, он управляет вертолетом (ну, слышали эту историю), он умеет чинить объективы и возит с собой 2 чемодана инструментов, кроме того, он дизайнер интерьеров, умеет чертить что-то и строить. Реснянский специалист по офшорам на Кипре (ну, вы слушали эту историю)! А еще он не спит. Вот серьезно, еще никто не видел его спящим. Зато видели его титановый топорик, который он взял зачем-то и теперь всем его показывает. Это только часть его способностей. Все члены нашей команды в случае чего обращаются за помощью к Реснянскому, так что он заслужил быть человеком-пароходом, а автомобиль, в котором он едет, теперь носит позывной «Крузенштерн-Реснянский». Теперь так по рации и вызываем: «Крузенштерн-Реснянский, Крузенштерн-Реснянский, ответьте Беллинзгаузену! Прием!»

Начнем с видео о вчерашнем дне, которое оперативно подготовил Реснянский:

Четвертый день мы продолжили ехать по пустыне Западной Сахары.

Западная Сахара очень странная территория. На многих картах ее обозначают отдельной страной, хотя Марокко считает Западную Сахару своей частью. Раньше это была испанская колония, потом испанцы отдали кусок пустыни за ненадобностью. Марокко и Мавритания немного повоевали за Сахару и страна отошла к Марокко. Местным ребятам, из фронта Полисарио не очень понравилось, что Марокко и Мавритания поделили их страну между собой и объявили независимость Западной Сахары. Партизаны действовали при поддержке Алжира, так что быстро усмирить их не получилось. В какой-то момент Марокко даже построили огромную «Марокканскую стену» через всю страну, которая затруднила фронту Полисарио борьбу с марокканскими оккупантами. Только в 1991 году партизаны заключили с Марокко перемирие.

Независимость Западной Сахары признано 54 государствами мира. Много это или мало, не знаю, но независимости здесь не ощущается. Границы между Марокко и Западной Сазарой нет никакой. Своих денег у Западной Сахары тоже нет. На дорогах стоят марокканские полицейские. В общем, ничто не выдает какой-то особой независимости от Марокко. Тем ни менее Полисарио не оставляет попыток провести референдум и получить официальную независимость от Марокко.

Ночь мы провели в городе Эль-Аюн, это самый крупной город Западной Сахары и, возможно, скоро он станет официальной столицей. Сейчас же он находится под контролем марокканской администрации.

В городе живет 200 000 человек или половина всего населения Западной Сахары.

01. Делать тут совершенно нечего. Город относительно новый, пустой и скучный.

02. Дешевый отель.

03. Дорогой отель.

04. Как и в остальных города Марокко, в Эль-Аюне куча кафе на улицах и все сидят пьют чай или кофе. Кофе, кстати, неплохой.

05. Люк.

06. Мясная лавка.

Мы с Ловыгиным честно обошли весь центр города и так ничего не сняли. Вообще ничего интересного. Просто скучные новые дома и пыльные дороги. Все.

07. Выезжаем из города и нас сразу тормозят полицейские. Тормозят за превышение скорости. Там был какой-то пост и стояло ограничение в 20 км. ч. Конечно, никто такие ограничения не соблюдает. Мы тоже, проехав пост, начали разгоняться, тем более, впереди был знак «100». Но за знаком сидели полицейские с радаром. Отдали 30 евро.

08. Вся дорога совершенно одинаковая. Она идет вдоль побережья. За 550 км пути нам не встретилось ни одного дерева.

09. Всю вторую половину пути был сильный туман.

10. Берег моря.

11. Тоже пустота…

12. Нет ничего скучнее, чем ехать 1000 км по пустыне… Завтра нам предстоит еще 320 км до границы с Мавританией.

13. Руководитель службы протокола, Александр Колесников, осматривает окрестности в поисках хоть чего-то интересного.

14. Я сплю. Снял, кстати, Реснянский.

15. Ловыгин фотофиксирует пространство.

16. На въезде в каждый город стоят ворота, часто с какими-то скульптурами. Местные жители очень спортивны. Несмотря на +42, они бегают в спортивных костюмах.

17. У любого приличного человека должна быть такая фотография. Снял, кстати, Ловыгин.

18. Берег почти везде скалистый. Подойти к океану нельзя.

19. Удивительно, но в этих обрывах еще живут какие-то люди!

20. Западная Сахара…

21. Красота.

22. Обед апельсином. Снял, кстати, Реснянский!

23. На четвертый день нашу экспедицию опять поджидал неприятный сюрприз. Едем мы по пустыне, любуемся пейзажами, как вдруг камень от встречного грузовика прилетает прямо в лобовое стекло. Камень, видимо, был очень большим, так что разбивается не только первый слой, но и второй. Меня засыпает мелкими осколками.

24. Останавливаемся, очищаем машину от осколков… Теперь надо искать сервис и покупать новое стекло, с таким ехать долго нельзя. Как временная мера — заклеиваем стекло скотчем.

25. Вообще самая большая проблема это блок-посты. На каждом посту полиция переписывает все паспортные данные, беседует «за жизнь» и просит подарки. В итоге теряется по 15 минут на каждом посту. Иногда посты идут через каждый километр… Даже если вас останавливали и переписывали на въезде в город, вас обязательно остановят и перепишут на выезде. Ужас. На фото руководитель службы протокола, Колесников, общается с полицией.

26. К вечеру доезжаем до Дахлы.

Завтра Мавритания!

Еще вы можете позвонить мне по этому номеру — +7(499)272-08-58. Сеанс связи с 20 до 21 по московскому времени (но если очень соскучились, то можно звонить в любое время). Спонсор связи

Pond Mobile — первый международный оператор связи, предоставляющий уникальные услуги для международных бизнесменов.

Предыдущие отчеты:
День 1: Касабланка, Марокко
День 2: Эс-Сувейра и дорога на юг, Марокко
День 3: Долгая дорога в Западную Сахару

Спонсоры экспедиции:

LADIVAL — Ladival — легендарный бренд солнечной косметики из Германии. Содержит факторы защиты от ультрафиолетового и инфракрасного излучения. Путешествуйте по миру и наслаждайтесь солнцем вместе с Ladival. Ищите Ladival в аптеках!

SuperFonarik — Магазин правильных фонарей. Высококачественные фонари на все случаи жизни.

Телескопы, микроскопы, бинокли «Левенгук». Приближают с удовольствием.

«Асфалайт» — холодный асфальт.

oktogo.ru — бронирование отелей онлайн по всему миру.

Aviasales.ru — Партнёр моих путешествий — лучший в рунете поисковик дешевых авиабилетов Aviasales.ru. Он ищет и сравнивает цены на перелёты по всем известным онлайн кассам, системам бронирования и авиакомпаниям. Вот почему вы находите действительно самую выгодную цену и сами выбираете у кого бронировать.

Pond Mobile — первый международный оператор связи, предоставляющий уникальные услуги для международных бизнесменов.

RedPoint — лучшие аксессуары для мобильных телефонов.

RaceChip.ru — увеличение мощности авто до 31%.

Эмигрант — визовая поддержка экспедиции.

Друзья, за экспедицией можно следить и на и на страничках нашего спонсора – солнечной косметики Ladival в Фейсбуке и Вконтакте. Скоро там начнут разыгрывать интересные призы, не пропустите!

———————————————
Чтобы сделать перепост, нажмите на одну из кнопочек ниже:

Советую также подписаться на мои странички в:

Фэйсбук

ВКонтактик

Основной Твиттер

Спам Твиттер

Реклама в этом блоге
Чем я занимаюсь
За что я баню
Я в других социальных сетях

#африка#западная_сахара#автопробег#авто

Западная Сахара: последняя колония в Африке

Созданную в 1976 году Сахарскую Арабскую Демократическую Республику сегодня признало 84 государства мира. Но большая часть бывшей испанской колонии Западная Сахара остается под контролем Марокко. Мавритания вывела свои силы с этой территории.

С 1991 года между войсками западносахарского фронта ПОЛИСАРИО и марокканскими войсками действует перемирие. Несмотря на многочисленные резолюции ООН, в регионе так и не прошел референдум, который должен решить судьбу последней колонии в Африке.

На подконтрольной Марокко территории Западной Сахары проходят массовые акции протеста сахарцев. В декабре в Алжире состоится конференция солидарности с народом Западной Сахары.

Собеседником обозревателя Радио Свобода Михаила Соколова был представитель фронта ПОЛИСАРИО в России


доктор Али Салем Фадель.

Али Салем Фадель

– Сколько сейчас беженцев, вынужденных покинуть Западную Сахару, находится в изгнании?

– Фактически более половины народа Западной Сахары с 1975 года находится в изгнании. Они живут в лагерях беженцев около города Тиндуфа. Я думаю, что сейчас это 200-250 тысяч на освобожденных территориях и в лагерях беженцев.

– Сколько западносахарцев (сахрави) сейчас живет на территории, которую контролирует Марокко?

– Население Западной Сахары сейчас около 500 тысяч человек. Соотношение все время меняется. Примерно один сахрави к трем переселенцам: там сейчас около 150 тысяч коренного населения.

– За эти годы в Западную Сахару переселилось из Марокко более 300 тысяч человек?

– Да, из Марокко переселилось очень много. Им говорили: «Вы не нашли в Марокко работу, можете найти ее в Западной Сахаре». Там уже второе поколение растет. Переселенцы есть повсюду, по всей нашей территории.
Конечно, это очень сложный процесс. По марокканской версии, это не переселенцы, это тоже коренное население. Но марокканцы – это марокканцы, а западносахарцы – это западносахарцы. Они отличаются по обычаям, по традициям. Ничего общего, кроме ислама.

Сейчас обеими сторонами конфликта какие-то военные действия ведутся или перемирие соблюдается?

– 6 сентября 1991 года был прекращен огонь между двумя сторонами, согласно резолюции Совета Безопасности ООН № 690. С сентября 1991 года миротворцы находятся фактически на всей территории Западной Сахары. Есть несколько их центров в каждом освобожденном регионе, есть они и на оккупированных территориях Западной Сахары. Они контролируют процесс прекращения огня. Кроме того, они проводят идентификацию избирателей. Уже около 90 тысяч имеют легальное право на голосование на референдуме о судьбе Западной Сахары.

Мы подписали с Марокко два договора – в 1991 и в 1997 годах. Но, к сожалению, Марокко никак не хочет проводить плебисцит. Они увидели список избирателей и сделали вывод, что потеряют Западную Сахару. Но они и так ее будут терять, потому что насилие рождает насилие.

– Какие вопросы должны быть вынесены на референдум?

– Должны быть два-три варианта: независимость, аннексия или автономия. Марокканцы с 2007 года начали маневрировать, предлагать только какую-то «широкую автономию». Они не хотят проводить этот референдум.

– Ведется ли ненасильственное сопротивление на территориях, контролируемых Марокко?

– Уже 8 лет, с 19 мая 2005 года. Молодежь ждала этот референдум. Видели, что миротворцы сидят, получают деньги и фактически ничего не делают. Нет референдума, нет защиты прав человека, нет ничего. И начали организовывать мирные демонстрации. Они до сих пор ведутся. Марокканский ответ очень жесток, хотя наш народ только требует выполнения решений ООН. Три дня тому назад я получил предварительный список недавно пострадавших. В нем около 120 человек раненых. Это просто массовые репрессии!

– Сколько сейчас в Западной Сахаре политзаключенных?

– К сожалению, пресса не пишет, что “арабская весна” началась у нас 9 октября 2010 года. Большинство населения главного города Западной Сахары Эль-Аюна ушло на 15 километров от столицы в район, который называется Gdeim Izik. Там поставили 8 тысяч шатров и палаток. Сначала были выдвинуты социально-экономические требования: “Вы эксплуатируете наши ресурсы, но как нас оставила Испания, так мы и живем”. Люди требовали работу, образование. А потом появились политические лозунги. Власти Марокко никаких обещаний не дали, потом марокканцы окружили этот лагерь военными силами и разгромили утром 8 ноября 2010 года. Десятки людей погибли.

Официально политзаключенных в Марокко сейчас 26 человек. Это как раз группа организаторов лагеря протеста Gdeim Izik. В феврале 2013 года над ними провели военный суд, некоторых приговорили к пожизненному заключению, некоторым дали по 30 лет, другим – 25 и 20 лет и только двум – по 2 года. Они находятся в марокканских тюрьмах. Есть и политические заключенные – западносахарцы, которые сидят в кошмарных «черных тюрьмах» на оккупированной территории.

За период войны у нас есть список из 520 человек, которых мы ищем, которые пропали без вести. Недавно нашли братские могилы людей, которых расстреляли. Есть список из более 100 наших военных, которых пропали без вести, мы все время требуем от Марокко, чтобы нам сообщили, живы они или умерли. Они освободили только 66 пленных.

А фронт ПОЛИСАРИО освободил марокканских военнопленных?

– Это был один из пунктов договора, что мы должны обменяться пленными военными, а потом провести референдум. У нас было около 4000 пленных. Мы давно их уже всех освободили группами по 100, 200, 400. Пока сделаны две вещи: прекращение огня и идентификация избирателей.

Кто должен участвовать в референдуме? Что делать с людьми, которые уже много лет живут на территории Западной Сахары, переехав из Марокко?

– В апреле 2007 года мы дали предложение в Совет Безопасности ООН. После проведения, если народ Западной Сахары получит независимость, мы будем относиться к каждому индивидуально. Переселенец живет, мы не против, чтобы он жил. Если эти люди не захотят уезжать, мы даже готовы представить в определенном порядке им гражданство.Против народа мы ничего не имеем.

Мы готовы сотрудничать с Марокко в международной политике, рассмотреть проблемы экономического сотрудничества. А вот Марокко держится за эту «широкую автономию». Но никто не понимает, что такое «широкая автономия».

– А есть ли у Рабата какой-то конкретный план, где было бы написано, что хочет предоставить Марокко Западной Сахаре как автономии?

– Они хотят сохранить имидж: короля, флаг, общую валюту и границы. Остальные полномочия якобы мы должны получить… Но пусть это делает Марокко, если победит на референдуме.

Мы не хотим торговаться. Проблема Западной Сахары – это вопрос деколонизации. Испания решила предоставить независимость Западной Сахаре еще в 1975 году. Все резолюции ООН каждый год подтверждают, что наш народ должен определить свою судьбу. Сейчас в мире есть 16 территорий, которые должны решить свою судьбу через референдум. Единственная такая территория в Африке – это Западная Сахара. Больше одной трети стран мира (84) признают Сахарскую Арабскую Демократическую Республику.

Если Марокко считает себя демократическим режимом, пусть пройдет плебисцит. Вы говорите, что народ Западной Сахары хочет в Марокко? Пожалуйста, проведем голосование! Это очень простой процесс – дайте слово этому народу. Но до сих пор они этого не хотят, не могут. И начали репрессии.

Али Салем Фадель

Прежний король Хасан II был человеком более разумным. В 1975 году он заявил, что в течение двух недель завоюет Западную Сахару и все будет в порядке, но эта война продолжалась 16 лет. И в 1989 году Хасан II заявил перед прессой: «Я готов принять любую делегацию из Западной Сахары».

Мы в течение 24 часов ответили, что приедем в Марокко. Делегация, в которую входили тогдашние министры Мустафа Баши и Хаммад Хаддат, прибыла в Марокко. Хасан II им сказал: даю 20 минут. Они говорили 2 часа и на следующий день провели второй раунд переговоров. На переговорах присутствовал и наследник престола, нынешний король Мухаммед VI.

Тогда Хасан II сказал: «Мы сделали ошибку, завоевав Западную Сахару силой. Это была большая ошибка. И чтобы прошел процесс ассимиляции Западной Сахары и народа Марокко, надо 400 лет мира».

Потом король заявил перед народом, что он готов провести референдум в Западной Сахаре. Сказал, что если сахрави проголосуют за независимость, Марокко будет первым, кто откроет посольство в Эль-Аюне. И тогда начался процесс мирного урегулирования.

Хотя мы знаем, что он был наш противник, но он был умный оппонент. Он знал, что такое война. Он понял, что невозможно этот конфликт решить военным путем. К сожалению, он умер в 1999 году.

– А какова линия нынешнего короля Мухаммеда VI? Есть какое-то изменение позиции Марокко в пользу разумного решения?

– Пока нет. Даже когда спецпосланник ООН Кристофер Росс два раза приезжал в Марокко. Мухаммед VI с ним не встретился, хотя со спецпосланником Россом встречались президенты Алжира и Мавритании. Король не готов ни к чему. Окружение короля играет не в пользу решения конфликта. Потому что от этого многие люди обогатились. Это генералы, это верхушка элиты, которая использует богатства Сахары.

Пока Франция не дает королю сигнал – решить этот конфликт, король будет так себя вести. Потому что наша проблема – не Марокко, наша проблема – это французский режим, который постоянно поддерживает Марокко. Франция готова даже использовать право вето в ООН против любого решения, которое позволит закончить процесс деколонизации.

– Какова позиция Испании?

– Испания исторически, юридически и морально должна решить проблему Западной Сахары, как решила Португалия вопрос Восточного Тимора, потому что единственная страна, которая на это имеет право. Западная Сахара – испанская колония, а Марокко – это оккупант. Испания должна была провести референдум еще в 1974 или в 1975 году, но не смогла это сделать.
Испанский народ с народом Западной Сахары образовали многочисленные комитеты солидарности. Некоторые области до этого кризиса вели экономическое финансирование проектов поддержки Западной Сахары. До сих пор помощь оказывается. Хотя Испания находится в группе «друзей Западной Сахары» (в ней Россия, Франция, Великобритания и США), позиция Мадрида очень пассивная.

– В Марокко во время «арабской весны» были демонстрации. Король в чем-то пошел на уступки. Есть ли в Марокко политические силы, которые считают, что нужно увести войска с территории Западной Сахары?

– В Марокко было создано движение за реформы, которое называется «22 февраля». Это движение организовывало демонстрации по всей территории Марокко. Они не требовали отставки короля, но лозунги были направлены на улучшение жизни людей, на изменение конституции и передачу полномочий короля правительству. Но, несмотря на обещания короля дать новую конституцию, сохраняется прежняя система. Думаю, что Мохаммед VI будет последним королем Марокко, если он не изменит политический курс, не сделает марокканцев из подданных гражданами.

К сожалению, здесь, на Западе, люди видят в Марокко лишь экзотику. А Марокко является первым государством мира по производству и экспорту гашиша. 25% населения занимаются гашишем. Почему? Потому что высок уровень неграмотности, уровень бедности. Среди оппозиционеров в Марокко есть те, кто выступают за референдум в Сахаре. Но для руководства Марокко поддерживать сахарцев – это грех.

Кстати, марокканцы сейчас говорят: народ Западной Сахары – наши братья! Раньше этого не было.

Насколько едины сами сейчас представители Западной Сахары? Некоторые бывшие деятели фронта ПОЛИСАРИО перешли на позиции поддержки «широкой автономии» и сотрудничают сейчас с властям Марокко?

– Во фронте ПОЛИСАРИО есть настоящая демократия. Почему мы говорим – фронт ПОЛИСАРИО? Почему не говорим партия? Потому что в него входит весь народ, и все люди, чья главная цель – освобождение Западной Сахары.

Решение проблемы Западной Сахары не зависит от мнения нескольких человек, которые перешли на сторону Марокко, даже если это, например, бывший министр иностранных дел. Мы их не критикуем.

В каждом народе есть оппортунисты, которые ищут личную выгоду. Настоящие борцы должен иметь определенные моральные принципы, они умирают, как деревья, стоя. Караван идет, собаки лают. Фронт как легитимный представитель нашего народа продолжает борьбу.

– Сейчас в этот регион проникает «Аль-Каида?

– Марокко хотело включить фронт ПОЛИСАРИО в список террористов – этого не получается. Все знают, что мы боремся против террористов. Мы как государство тоже страдаем от них. Два с половиной года назад впервые было нападение на наших гостей, когда захватили двух испанцев и одного итальянца. Так что мы готовы и дальше, если требуется, идти на войну против террористов.

– Как вы оцениваете сейчас позицию Россию?

– Мы от России ждем многого. Россия является одним из членов группы «друзей Западной Сахары». Россия всегда поддерживала принцип самоопределения народов, поддерживает все резолюции Генеральной Ассамблеи ООН по Западной Сахаре, а их уже больше 70. Россия поддерживает позицию Совета Безопасности, где говорится, что обе стороны – фронт ПОЛИСАРИО и Марокко – должны найти подходящие решения для урегулирования данного вопроса. Россия за любое решение, которое обе предлагают стороны. Россия против любого одностороннего решения. Россия держит контингент миротворцев в этом регионе.

Недавно при визите министров иностранных дел Алжира и Марокко глава МИДа РФ Сергей Лавров заявил, что Россия против нарушения прав человека в Западной Сахаре.

Мы ждем, что Россия сможет много полезного сделать в арабском мире и на африканском континенте, потому что там у нее нет врагов, со всеми хорошие отношения. Хватит все время привлекать Запад.

Россия признала Осетию, Абхазию, я приглашаю ее сделать такой же шаг по признанию Сахарской Арабской Демократической Республики.

– Вы верите, что рано или поздно Западная Сахара получит независимость?

– Тот, кто об этом не думает, не является политиком. Рано или поздно мир будет торговать с САДР. Список составляется, но не надо быть в нем последним. Если не будете первым, то хотя бы найдите место в середине. Рано или поздно, но мир будет с нами иметь дело, в том числе и Россия.

zap/options.go на мастере · uber-go/zap · GitHub

.

ур.

// Copyright (c) 2016 Uber Technologies, Inc.
//
// Настоящим предоставляется бесплатное разрешение любому лицу, получившему копию
// данного программного обеспечения и связанных с ним файлов документации («Программное обеспечение»), для сделки
// в ПО без ограничений, включая без ограничения права
// использовать, копировать, изменять, объединять, публиковать, распространять, сублицензировать и/или продавать
// копии Программного обеспечения и разрешить лицам, которым Программное обеспечение
// предоставляется для этого при соблюдении следующих условий:
//
// Приведенное выше уведомление об авторских правах и это уведомление о разрешении должны быть включены в
// все копии или существенные части Программного обеспечения.
//
// ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ
// ПОДРАЗУМЕВАЕТСЯ, ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ,
// ПРИГОДНОСТЬ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЕ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ
// АВТОРЫ ИЛИ ВЛАДЕЛЕЦ АВТОРСКИХ ПРАВ НЕСУТ ОТВЕТСТВЕННОСТЬ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УЩЕРБ ИЛИ ДРУГОЕ
// ОТВЕТСТВЕННОСТЬ, БУДУЩАЯ ИЗ КОНТРАКТА, ДЕЛИКТА ИЛИ ИНЫМ ОБРАЗОМ, ВОЗНИКАЮЩАЯ ИЗ,
// ВНЕ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ В
// ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
упаковка
импорт (
«фмт»
«go.uber.org/zap/zapcore»
)
// Параметр настраивает регистратор.
Тип Дополнительный интерфейс {
применить (* регистратор)
}
// optionFunc оборачивает func, чтобы он удовлетворял интерфейсу Option.
тип optionFunc func(*Logger)
func (f optionFunc) apply(log *Logger) {
ф(лог)
}
// WrapCore обертывает или заменяет лежащий в основе Logger zapcore.Core.
func WrapCore(f func(zapcore.Core) zapcore.Core) Option {
return optionFunc(func(log *Logger) {
лог.ядро = f(лог.ядро)
})
}
// Хуки регистрируют функции, которые будут вызываться каждый раз, когда Logger записывает
// выход из записи. Повторное использование хуков является аддитивным.
//
// Хуки полезны для простых побочных эффектов, таких как сбор метрик для
// количество сгенерированных логов. Более сложные побочные эффекты, включая все, что
// требуется доступ к структурированным полям записи, должно быть реализовано как
// вместо этого zapcore.Core. Подробности смотрите в zapcore.RegisterHooks.
func Hooks (hooks … func (zapcore.Entry)) Option {
return optionFunc(func(log *Logger) {
log. core = zapcore.RegisterHooks(log.core, крючки…)
})
}
// Fields добавляет поля в Logger.
func Fields(fs …Field) Опция {
return optionFunc(func(log *Logger) {
лог.ядро = лог.ядро.С(фс)
})
}
// ErrorOutput устанавливает место назначения для ошибок, сгенерированных регистратором. Примечание
// эта опция влияет только на внутренние ошибки; для примера кода, который отправляет
// журналы уровня ошибок в другое место, чем журналы уровня информации и отладки,
// см. пример AdvancedConfiguration на уровне пакета.
//
// Предоставленный WriteSyncer должен быть безопасным для одновременного использования. Открытый и
// Функции zapcore.Lock — простейшие способы защиты файлов с помощью мьютекса.
функция ErrorOutput(w zapcore.WriteSyncer) Опция {
return optionFunc(func(log *Logger) {
log. errorOutput = w
})
}
// Разработка переводит логгер в режим разработки, что делает уровень DPanic
// регистрирует панику, а не просто регистрирует ошибку.
func Development() Опция {
return optionFunc(func(log *Logger) {
лог.развитие = правда
})
}
// AddCaller настраивает Logger для аннотирования каждого сообщения именем файла,
// номер строки и имя функции вызывающей программы zap. См. также WithCaller.
Функция AddCaller() Опция {
возврат WithCaller(true)
}
// WithCaller настраивает Logger для аннотирования каждого сообщения именем файла,
// номер строки и имя функции вызывающего zap, или нет, в зависимости от
// значение включено. Это обобщенная форма AddCaller.
func WithCaller (enabled bool) Option {
return optionFunc(func(log *Logger) {
log. addCaller = включено
})
}
// AddCallerSkip увеличивает количество вызывающих абонентов, пропущенных аннотацией вызывающего абонента
// (включено опцией AddCaller). При создании оболочек вокруг
// Logger и SugaredLogger, предоставление этой опции предотвращает zap всегда
// сообщает о коде-оболочке как о вызывающей стороне.
функция AddCallerSkip (пропустить интервал) Опция {
return optionFunc(func(log *Logger) {
log. callerSkip += пропустить
})
}
// AddStacktrace настраивает Logger для записи трассировки стека для всех сообщений в
// или выше заданного уровня.
func AddStacktrace (lvl zapcore.LevelEnabler) Option {
return optionFunc(func(log *Logger) {
лог.addStack =
})
}
//УвеличитьУровень увеличить уровень логгера. Не действует, если
// переданный уровень пытается понизить уровень логгера.
Функция повышения уровня (уровень zapcore.LevelEnabler) Опция {
return optionFunc(func(log *Logger) {
ядро, ошибка := zapcore.NewIncreaseLevelCore(log.core, lvl)
если ошибка != ноль {
fmt.Fprintf(log.errorOutput, «не удалось повысить уровень: %v\n», ошибка)
} еще {
лог.ядро = ядро ​​
}
})
}
// OnFatal устанавливает действие для фатальных журналов.
//
// Устарело: вместо этого используйте [WithFatalHook].
функция OnFatal (действие zapcore.CheckWriteAction) Option {
возврат WithFatalHook(действие)
}
// WithFatalHook устанавливает CheckWriteHook для запуска фатальных журналов.
// Zap вызовет этот хук после записи оператора журнала с фатальным уровнем.
//
// Например, следующий строит регистратор, который выйдет из текущего
// горутина после записи фатального сообщения в журнал, но она не выйдет из
// программа.
//
// zap.New(core, zap.WithFatalHook(zapcore.WriteThenGoexit))
//
// Важно, чтобы предоставленный CheckWriteHook останавливал поток управления на
// текущий оператор для удовлетворения ожиданий вызывающих логгер.
// Мы рекомендуем вызывать os.Exit или runtime.Goexit внутри пользовательских хуков по адресу
// минимум.
func WithFatalHook(hook zapcore.CheckWriteHook) Option {
return optionFunc(func(log *Logger) {
log. onFatal = хук
})
}
// WithClock указывает часы, используемые регистратором для определения текущего
// время для зарегистрированных записей. По умолчанию системные часы с time.Now.
func WithClock(часы zapcore.Clock) Опция {
return optionFunc(func(log *Logger) {
лог.часы = часы
})
}

Структурированное ведение журналов в Golang с Zap

В этой статье мы рассмотрим структурированное ведение журналов в Golang с Zap от Uber! Когда дело доходит до разработки продукта, ведение журнала играет жизненно важную роль в выявлении проблем, оценке производительности и знании состояния процесса в приложении. В большинстве случаев мы ожидаем, что регистратор предоставит нам такую ​​информацию, как уровень журнала, метка времени, сообщение об ошибке, трассировка стека, которая может точно определить строку кода, вызвавшую исключение, и так далее.

Вы можете найти исходный код реализации Zap Logger на Golang здесь .

Содержание

Стандартный пакет ведения журнала Golang — объяснение

Итак, по умолчанию Golang поставляется со стандартным пакетом ведения журнала, который довольно прост в использовании. Он может регистрировать сообщения как на консоли, так и во внешнем файле. Вы можете найти пакет ведения журнала здесь — https://pkg.go.dev/log

Вот синтаксис для использования пакета журнала Golang по умолчанию.

 пакет основной
импортировать "журнал"
основная функция () {
log. Println("Привет, мир!")
} 

После того как вы запустите приложение Go, вот как сообщение будет записано в консоль. Вы можете видеть, что этот пакет ведения журнала по умолчанию также может распечатывать дату и время.

 27.03.2022 10:33:19 Привет, мир 

Теперь, если вы хотите записать эти журналы в текстовый файл, вам нужно будет сделать следующее.

 основной пакет
импорт (
"журнал"
"Операционные системы"
)
основная функция () {
logFile, _ := os.OpenFile("log.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
отложить logFile.Close()
log.SetOutput(logFile)
log.Println("Привет, мир!")
} 

Здесь, в строке 7, мы фактически открываем файл log. txt в режиме создания и добавления. В следующей строке мы указываем программе закрыть файл после выхода из функции. В строке 9 для экземпляра регистратора мы устанавливаем выходной файл как ранее открытый файл журнала. После этого каждый раз, когда мы что-либо регистрируем с помощью пакета журнала, сообщения и содержимое будут записываться в определенный файл журнала.

Запустим программу Golang.

Вы видите, что есть только что созданный файл с именем log.txt в корне приложения, которое содержит зарегистрированное сообщение.

Хотя с регистратором по умолчанию довольно просто работать, он не имеет всех необходимых функций для включения в производственную систему. Это хорошо для быстрой разработки/прототипа, но для сценариев в реальном времени он едва отвечает всем требованиям. Мы бы предпочли журналы, которые являются более структурированными и легко читаемыми. Это означает, что с журналами, выбрасываемыми системой, нам, по сути, нужно было бы классифицировать их для облегчения идентификации и, вероятно, содержать гораздо больше полей и данных.

Основными преимуществами стандартного пакета журнала Golang являются следующие:

  1. Очень простое ведение журнала.
  2. Ограниченные уровни журналов. Невозможно разделить сообщения на информационные, предупредительные, фатальные, ошибки и т. д.
  3. Во время исключения с использованием методов Fatal или Panic приложение завершает работу. Невозможно зарегистрировать сообщение об ошибке, не выходя из приложения.
  4. Примитивное форматирование сообщений. Было бы лучше, если бы были способы включить трассировку стека, при необходимости отформатировать дату и время, добавить дополнительные контексты и т. д.

Вот почему нам нужно лучшее решение для регистрации сообщений в приложении Golang.

Представляем Zap

Zap — это пакет ведения журнала от разработчиков Uber. Он рекламируется как «Сверхбыстрая, структурированная, уровневая регистрация в Go ». Этот пакет предположительно решает все проблемы, которые у нас были с пакетом ведения журнала Go по умолчанию. Он не только обеспечивает гибкий способ регистрации сообщений, но также является самым быстрым пакетом регистрации для приложений Golang.

Вот как это выглядит в сравнении с другими пакетами журналов Golang.

Zap поставляется с 2 различными типами регистраторов в зависимости от вашего варианта использования. В приложениях, где производительность не так критична, можно использовать SuggaredLogger (который все же в 4–10 раз быстрее других структурированных логгеров). Он поддерживает как структурированное ведение журнала, так и обычное ведение журнала printf!

В случаях, когда производительность приложения критична, используется Logger от Zap. Это намного быстрее, чем SuggaredLogger, но поддерживает только структурное ведение журнала.

Давайте рассмотрим несколько примеров кода о том, как реализовать ведение журнала структуры в Golang с помощью Zap, и внесем некоторые изменения, чтобы немного больше настроить этот замечательный регистратор!

Начало работы со структурированным ведением журналов в Golang с помощью Zap

Для этой реализации я буду использовать VSCode в качестве IDE для разработки прототипа Golang. Давайте начнем с создания новой папки и открытия папки с VSCode.

Инициализируйте приложение Go, создав новый файл main.go и выполнив следующую команду.

 go mod init logging-example 

Это создаст для вас файл go.mod в каталоге.

Далее давайте установим пакет Zap, выполнив следующую команду go get.

 go get -u go.uber.org/zap 

Прежде чем приступить к реализации, в этой статье также рассматриваются чистые методы разработки приложения Golang. При этом с точки зрения разработки приложений пакеты журналирования обычно являются чем-то внешним и могут рассматриваться как утилита для всего приложения, которую можно переключать при необходимости. Это можно сделать, переместив код инициализации и использования регистратора в другой пакет, отличный от основного пакета.

Итак, давайте создадим новую папку с именем utils и создадим в ней новый файл с именем logger.go .

Вход в консоль с помощью Zap в Golang

Во-первых, так будет выглядеть файл logger.go с минимальным кодом инициализации. Мы добавим больше функций к этому в будущем. На данный момент наше требование довольно простое — регистрировать сообщения на консоли в структурированном виде.

 пакет утилит
импорт (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var Регистратор *zap.Logger
функция InitializeLogger() {
регистратор, _ = zap.NewProduction()
} 

Обратите внимание, что имя пакета — «utils». Это гарантирует, что экземпляр регистратора можно будет использовать во всем приложении после его инициализации из точки входа основного пакета, которая является основной функцией.

Строки с 7 по 9, эта функция будет вызываться основной функцией, которая будет инициализировать экземпляр регистратора Zap.

Теперь перейдите к основной функции в основном файле go и вставьте что-то похожее. Обратите внимание, что ваш раздел импорта будет отличаться от моего.

 пакет основной
импорт (
"github.com/iammukeshm/structured-logging-golang-zap/utils"
"go.uber.org/zap"
)
основная функция () {
utils.InitializeLogger()
utils.Logger.Info("Привет, мир")
utils.Logger.Error("Не удалось получить доступ к блогу.",zap.String("url", "codewithmukesh.com"))
} 

Строка 7 вызывает функцию Initialization пакета регистратора, который мы написали ранее.

Строка 8 добавляет простой журнал информационного уровня.

Строка 9 добавляет журнал уровня ошибок. Обратите внимание, что метод Error может принимать n аргументов. Первым аргументом всегда должно быть сообщение об ошибке, за которым следуют различные аргументы zap, которые будут обозначать поля в результирующем журнале JSON. В этом случае мы вернем простое исключение, говорящее о том, что приложение не может получить доступ к определенному URL-адресу. Чтобы лучше понять, давайте запустим приложение Golang и проверим.

Это вывод, который вы увидите в терминале.

 {
    "уровень": "ошибка",
    "тс": 1648382422.5089228,
    "вызывающий": "utils/logger.go:22",
    "msg": "Не удалось получить доступ к блогу.",
    "url": "codewithmukesh.com",
    "попытка": 3,
    "stacktrace": "github.com/iammukeshm/structured-logging-golang-zap/utils.Error\n\tD:/go-repo/structured-logging-golang-zap/utils/logger.go:22\nmain. main\n\tD:/go-repo/structured-logging-golang-zap/main. go:10\nruntime.main\n\tC:/Program Files/Go/src/runtime/proc.go:250"
} 

Вы можете видеть, что мы получаем уровень лога, метку времени (в другой кодировке), файл, который вызывает метод лога, сообщение, трассировку стека и другие параметры, которые мы передали при вызове этой функции лога. Также обратите внимание, что сообщения представлены в формате JSON.

Теперь давайте добавим в код несколько жизненно важных настроек и сделаем его более готовым к работе. Во-первых, давайте заставим регистратор писать в файл, а не в консоль.

Вход в файл с помощью Zap в Golang

Вам придется внести эти изменения в метод Initialize.

 функция инициализации () {
конфиг := zap.NewProductionEncoderConfig()
       config.EncodeTime = zapcore.ISO8601TimeEncoder
fileEncoder: = zapcore. NewJSONEncoder (конфигурация)
logFile, _ := os.OpenFile("log.json", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
писатель := zapcore.AddSync(logFile)
defaultLogLevel := zapcore.DebugLevel
ядро := zapcore.NewTee(
zapcore.NewCore (fileEncoder, писатель, defaultLogLevel),
)
logger = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
} 

Строка 2 создает новую конфигурацию для кодировщика zap.

Строка 3 устанавливает кодировщик времени в соответствии со стандартным форматом времени ISO.

В строке 4 создается файловый кодировщик, соответствующий стандартной кодировке JSON.

Строка 5 открывает файл log.json в режиме создания и добавления.

Строка 6 создает средство записи файлов, которое позже будет использоваться zap для записи сообщений в файл.

Строка 7, мы просто создаем переменную, которая говорит, что уровень ведения журнала по умолчанию будет Debug. Вы можете изменить его так, как хотите.

В строке 8-10 добавьте средство записи файлов, кодировщик и уровень журнала по умолчанию для экземпляра ядра zap.

Строка 11 создает новый экземпляр Zap, передавая ранее созданные конфигурации. Он также добавляет другие параметры, такие как включение вызывающего журнала и трассировку стека (для ошибок).

Запустим приложение и проверим.

Вы можете видеть, что приложение создает для нас файл log.json и добавляет в него JSON, соответствующий инициированной нами ошибке, вместе с полной трассировкой стека ошибки.

Вход в файл и консоль с помощью ZAP в Golang

Но теперь, если вы заметили, приложение больше не входит в консоль. Есть способ сделать так, чтобы Zap регистрировался в нескольких областях, как в файле, так и в консоли. Для этого нам, возможно, придется снова изменить функцию Initialize следующим образом, добавив выделенные строки кода.

 функция инициализации () {
конфиг := zap. NewProductionEncoderConfig()
        config.EncodeTime = zapcore.ISO8601TimeEncoder
fileEncoder: = zapcore.NewJSONEncoder (конфигурация)
consoleEncoder := zapcore.NewConsoleEncoder(config)
logFile, _ := os.OpenFile("text.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
писатель := zapcore.AddSync(logFile)
defaultLogLevel := zapcore.DebugLevel
ядро := zapcore.NewTee(
zapcore.NewCore (fileEncoder, писатель, defaultLogLevel),
zapcore.NewCore(consoleEncoder, zapcore.AddSync(os.Stdout), defaultLogLevel),
)
logger = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
} 

Запустите приложение еще раз и увидите консоль.

Могут быть некоторые варианты использования в реальном времени, например, мне нужно записывать в файл только ошибки, а все остальное — в консоль. Как бы вы это сделали? Просто измените уровень журнала по умолчанию и передайте разные значения для разных zapcore, которые вы создали в строках 10 и 11. Уловили идею? Есть довольно много модификаций, которые вы можете сделать, если поиграетесь с кодом.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *