diff --git a/proto/common/common.proto b/proto/common/common.proto
index 3221bdc3319e1da379daf089ca79f180e5b7f140..ac9e243400a7e36028ab9a096aee7af4106455d8 100644
--- a/proto/common/common.proto
+++ b/proto/common/common.proto
@@ -14,10 +14,13 @@ message Filter {
 
 message FindOptions {
   repeated string sort = 1;
-  int32 page_num = 2;
-  int32 page_size = 3;
+  int32 page_num = 2; // Deprecated
+  int32 page_size = 3; // Deprecated
   repeated string fields = 4;
   bool exclude_fields = 5;
+
+  int32 offset = 6;
+  int32 limit = 7;
 }
 
 
diff --git a/proto/log/log.proto b/proto/log/log.proto
new file mode 100644
index 0000000000000000000000000000000000000000..687b54528c8e7afcf195f099954d1da0e66e9a8d
--- /dev/null
+++ b/proto/log/log.proto
@@ -0,0 +1,109 @@
+syntax = "proto3";
+
+package log;
+
+import "google/protobuf/timestamp.proto";
+import "google/protobuf/any.proto";
+import "common/error.proto";
+
+option go_package = "git.perx.ru/perxis/perxis-go/proto/log;log";
+
+// LogLevel задает уровень журналирования.
+enum LogLevel {
+  // INFO - обозначает сообщения с нормальным, операционным уровнем журналирования.
+  INFO = 0;
+  // WARNING - обозначает сообщения, которые содержат потенциально вредные ситуации.
+  WARNING = 1;
+  // ERROR - обозначает другие ошибки в работе.
+  ERROR = 2;
+  // CRITICAL - обозначает серьезные ошибки, из-за которых программа может не выполнять некоторые функции.
+  CRITICAL = 3;
+  // FATAL - обозначает очень серьезные ошибки, которые могут привести к остановке приложения.
+  FATAL = 4;
+}
+
+// Caller представляет собой сообщение, которое содержит информацию о вызывающем объекте.
+// Каждый вызывающий объект может быть в одном из трех состояний: user, client, service.
+message Caller {
+  oneof caller {
+    string user = 1;     // user отображает учетную запись пользователя, инициировавшего действие.
+    string client = 2;   // client отображает учетную запись клиента, инициировавшего действие.
+    string service = 3;  // service отображает службу, инициировавшую действие.
+  }
+}
+
+
+// LogEntry представляет собой структуру данных для хранения информации о журнале.
+message LogEntry {
+
+  // id является уникальным идентификатором каждой записи в журнале.
+  string id = 1;
+
+  // action описывает действие, которое было произведено. Это поле может принимать разные значения в зависимости от сервиса.
+  // Примеры:
+  // - item.create
+  // - item.update
+  // - organization.create
+  // - action.run
+  // - reference.create
+  string action = 11;
+
+  // timestamp указывает на временную метку, указывающую когда было создано данное сообщение.
+  google.protobuf.Timestamp timestamp = 2;
+
+  // level это поле, обозначающее уровень приоритета сообщения в логе.
+  LogLevel level = 3;
+
+  // message это основное сообщение, которое требуется записать в лог.
+  string message = 4;
+
+  // category указывает на категорию события.
+  // Примеры:
+  // -
+  string category = 5;
+
+  // component обозначает компонент системы, где произошло данное событие.
+  // Примеры:
+  // - Items.Service
+  // - Items.API
+  // - Users.Service
+  // - Users.API
+  // - Janitor.Service
+  // - Tasks.Worker
+  string component = 6;
+
+  // organization обозначает организацию, с которой связано данное событие.
+  // В случае если событие не связано с организацией, то данное поле должно быть пустым.
+  // В случае если событие связано с организацией, то данное поле должно содержать идентификатор организации который
+  // проставляется системой логирования автоматически.
+  string organization = 7;
+
+  // space обозначает пространство, которому принадлежит данное событие.
+  // В случае если событие не связано с пространством, то данное поле должно быть пустым.
+  string space = 8;
+
+  // env обозначает среду в которой произошло данный процесс.
+  // В случае если событие не связано с средой, то данное поле должно быть пустым.
+  // По умолчанию среда равна master. При этом в лог записывается идентификатор среды соответсвующий master.
+  string env = 9;
+
+  // collection обозначает коллекцию в которой произошло событие.
+  // В случае если событие не связано с коллекцией, то данное поле должно быть пустым.
+  string collection = 10;
+
+  // object_type обозначает тип объекта с которым связано событие.
+  string object_type = 16;
+
+  // object_id это идентификатор объекта связанного с событием
+  string object_id = 17;
+
+  // caller содержит информацию о сущности вызвавшей событие
+  Caller caller = 13;
+
+  // attr содержит дополнительные связанные с событием атрибуты в формате Any
+  // позволяет добавить дополнительные данные в событие
+  google.protobuf.Any attr = 14;
+
+  // tags содержит теги связанные с событием, на усмотрение сервиса
+  repeated string tags = 15;
+}
\ No newline at end of file
diff --git a/proto/log/log_service.proto b/proto/log/log_service.proto
new file mode 100644
index 0000000000000000000000000000000000000000..44f77dea8d8b6409f06002aa49fbcfb809a81c8e
--- /dev/null
+++ b/proto/log/log_service.proto
@@ -0,0 +1,97 @@
+syntax = "proto3";
+
+package log;
+
+import "common/common.proto";
+import "common/error.proto";
+import "log/log.proto";
+import "google/protobuf/timestamp.proto";
+
+option go_package = "git.perx.ru/perxis/perxis-go/proto/log;log";
+
+
+// Сервис для записи активности в системе
+// Позволяет всем компонентам системы записывать логи в единое хранилище и получать их оттуда
+service LogService {
+  // Метод для записи логов
+  rpc Log(stream LogRequest) returns (LogResponse) {}
+
+  // Метод для обработки отдельной записи лога
+  rpc LogEntry(LogRequest) returns (LogResponse) {}
+
+  // Метод для поиска логов по заданным параметрам
+  rpc Find(FindRequest) returns (FindResponse) {}
+
+  // Метод для удаления логов по заданным параметрам
+  rpc Delete(DeleteRequest) returns (DeleteResponse) {}
+}
+
+// Запрос для лога
+message LogRequest {
+  // Запись лога
+  LogEntry entry = 1;
+}
+
+// Ответ сервера на запрос лога
+message LogResponse {
+  // Содержит информацию об ошибке, если таковая имеется
+  common.Error error = 1;
+}
+
+message Filter {
+  // Запрос на поиск логов
+  // Примеры:
+  // 1. `timestamp > '2019-01-01' AND timestamp < '2019-01-02'`
+  // 2. `timestamp > '2019-01-01' AND timestamp < '2019-01-02' AND level = 'error'`
+  // 3. `component = 'api' AND object.id = '123' AND object.type = 'item' AND context.space = 'spc1'`
+  // 4. `id in ['1', '2', '3']`
+  repeated string q = 3; // Список выражений для фильтрации
+}
+
+// Запрос на поиск логов
+message FindRequest {
+  // Фильтры для поиска
+  Filter filter = 2;
+
+  // Опции поиска
+  common.FindOptions options = 3;
+}
+
+// Результат поиска
+message FindResult {
+  // Найденные записи лога
+  repeated LogEntry entries = 1;
+
+  // Использовавшийся для поиска фильтр
+  // Для
+  common.Filter filter = 2;
+
+  // Использовавшиеся для поиска опции
+  common.FindOptions options = 3;
+
+  // Общее количество найденных записей
+  uint32 total = 4;
+}
+
+// Ответ сервера на запрос поиска
+message FindResponse {
+  oneof response {
+    // Результаты поиска
+    FindResult result = 1;
+
+    // Информация об ошибке, если таковая имеется
+    common.Error error = 2;
+  }
+}
+
+// Запрос на удаление логов
+message DeleteRequest {
+  // Фильтры для удаления
+  Filter filter = 2;
+}
+
+// Ответ сервера на запрос удаления
+message DeleteResponse {
+  // Информация об ошибке, если таковая имеется
+  common.Error error = 1;
+}
\ No newline at end of file